繁体   English   中英

与strcpy一起使用时出现分段错误(核心已转储)

[英]Segmentation fault (core dumped) when using with strcpy

我有以下代码将打印给定目录中的所有文件名。 但是错误是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;
}

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

当分配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 ** FILE_INFO *file_info; (并相应地更新其他代码)。

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

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会更好/更容易。

除了其他答案外,Linux中的文件长度上限为255个字符。 最大值为4095。写入file_info[j]->filename时可能存在缓冲区溢出。 file_info[j]->filename声明为char*并在源字符串上调用strdup()进行复制。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM