我正在编写一个c程序,从目录中读取文件和目录,然后指向结构数据中的元素数量,并指向同一结构数据中动态数组中元素的名称。我做到了,它的输出是正确的。问题是,当我运行程序时,会出现"分段故障(核心转储)"。
代码:
#include <stdio.h>
#include <dirent.h>
#define EXIT_FAILURE 1
typedef struct FileDir
{
int *n_files;
char *file_name[];
} FileDir;
int get_files_within_dir(struct FileDir *fd)
{
DIR *dir;
int n_files;
int index;
n_files = 0;
if ((dir = opendir ("/tmp")) != NULL) {
/* counts all the files and directories within directory */
while (readdir (dir) != NULL) {
n_files++;
}
closedir (dir);
} else {
/* could not open directory */
perror ("");
return EXIT_FAILURE;
}
char *file_name[n_files];
struct dirent *ent;
if ((dir = opendir ("/tmp")) != NULL) {
/* gets all the files and directories within directory */
index = 0;
while ((ent = readdir (dir)) != NULL) {
file_name[index++] = ent->d_name;
}
closedir (dir);
} else {
/* could not open directory */
perror ("");
return EXIT_FAILURE;
}
fd->n_files = n_files;
fd->file_name[0] = file_name[0];
fd->file_name[1] = file_name[1];
fd->file_name[2] = file_name[2];
fd->file_name[3] = file_name[3];
return 0;
}
int main()
{
struct FileDir fd;
get_files_within_dir(&fd);
printf("%dn", fd.n_files);
printf("%sn", fd.file_name[1]);
printf("%sn", fd.file_name[2]);
printf("%sn", fd.file_name[3]);
return 0;
}
输出:
[freitas@localhost src]$ ./file_dir
21
..
geany_socket.fcda02b3
tmpiSdUX3
Segmentation fault (core dumped)
有趣的是,如果我只是将小于或等于2的值指向结构的数据的动态数组,则不会显示错误消息。你知道吗?
谢谢!
您有两个问题,可能会导致分段故障
-
n_files
字段是一个指针,如果给它分配了一个整数,它应该声明为int n_files;
-
你从来没有为
file_name
字段分配空间,你至少应该提供一个固定的大小,比如这个char *file_name[1000];
您可以使用
malloc()
动态分配内存,但这是另一回事,需要解释。
注意:启用编译器警告将有助于防止出现像int *n_files
这样的愚蠢错误,然后再执行fd->n_files = n_files;
。
n_files不应该是指针
typedef struct FileDir
{
int n_files;
char *file_name[];
} FileDir;
然后你的线路
printf("%dn", fd.n_files);
不会崩溃。尝试使用调试器查看结构