我有以下代码,它将打印给定目录中的所有文件名。
但错误是Segmentation fault (core dumped)
。
我没有经验使用带指针的strcpy。
skipping include
extern int errno;
typedef struct fileinfo
{
char filename[256];
off_t filesize;
time_t mtime;
} FILE_INFO;
int main(int argc, char **argv) {
DIR *dir;
struct dirent *d_ent;
FILE_INFO **file_info;
int i = 0, j = 1;
if((dir = opendir("/")) ==NULL) goto err;
file_info = (FILE_INFO **)malloc(sizeof(FILE_INFO *) * j);
while((d_ent = readdir(dir)) != NULL)
{
file_info = (FILE_INFO **)realloc(file_info,sizeof(FILE_INFO *) * j);
strcpy(file_info[j]->filename, d_ent->d_name); //Error here Segmentation fault (core dumped)
j++;
}
for( i =0 ; i > j; i++)
{
printf("%s\n", file_info[i]->filename);
}
free(file_info);
return 0;
err:
printf("Error is : %d : %s", errno, strerror(errno));
return 0;
}
答案 0 :(得分:1)
注意:可能还有其他问题,但您提出的问题仍然存在问题。
当您分配j
元素时,会在j-1
访问最后一项,因此请将您的行更新为
//----------------v
strcpy(file_info[j-1]->filename, d_ent->d_name);
而不是
strcpy(file_info[j]->filename, d_ent->d_name);
此外,您应该使用FILE_INFO **
(并相应地更新其他代码),而不是使用FILE_INFO *file_info;
。
答案 1 :(得分:0)
您必须先为文件名分配空间。
file_info[j]->filename=malloc(strlen(d_ent->d_name)+1);
strcpy(file_info[j]->filename, d_ent->d_name);
或使用为这种东西制作的strdup函数:
file_info[j]->filename=strdup(d_ent->d_name);
不相关,但代码中的另一个错误:
for( i =0 ; i > j; i++)
应该阅读
for( i =0 ; i < j-1; i++)
然而,初始化j = 0会更好/更容易。
答案 2 :(得分:0)
除了其他答案,linux中的文件最长不超过255个字符。 max是4095.写入file_info[j]->filename
时可能存在缓冲区溢出。将file_info[j]->filename
声明为char*
并在源字符串上调用strdup()
以复制它。