与strcpy一起使用时出现分段故障(堆芯转储)

与strcpy一起使用时出现分段故障(堆芯转储),c,segmentation-fault,strcpy,C,Segmentation Fault,Strcpy,我有以下代码,它将打印给定目录中的所有文件名。 但错误是分段错误(堆芯转储)。 我没有使用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

我有以下代码,它将打印给定目录中的所有文件名。 但错误是分段错误(堆芯转储)。 我没有使用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;
}

您必须首先为文件名分配空间

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++)
(i=0;i
不过,初始化j=0会更好/更容易。

注意:可能还有其他问题,但您建议的行有以下问题

当您分配
j
元素时,最后一项在
j-1
处访问,因此将您的行更新为

//----------------v
strcpy(file_info[j-1]->filename, d_ent->d_name);
而不是

strcpy(file_info[j]->filename, d_ent->d_name);

此外,您应该使用
文件信息*文件信息,而不是使用
文件信息**
(并相应地更新其他代码)。

除了其他答案,linux中的文件长度不超过255个字符。马克斯是4095岁。可能是写入
文件时缓冲区溢出。将
file\u info[j]->filename
声明为
char*
并调用源字符串上的
strdup()
以复制它。

您是否刚刚将“char*filename”编辑为“char filename[256]”?当文件名是数组时,当然不必使用strdup。Rohans的答案是正确的,请记住C数组以索引0开头。@Guntran Bohm不兼容类型,当从类型“char*”分配到类型“char[256]”时,请参阅我对我的答案的第一条注释:如果您声明char filename[256]而不是char*filename,您在这方面没有问题。这个bug是你的
j
从数组中索引出来的。我的第一个答案或多或少是自动的,因为很多人都犯同样的错误;我不知道这不适用于你。。