gpt4 book ai didi

c - 从文件读取时出现段错误

转载 作者:行者123 更新时间:2023-12-04 10:07:25 26 4
gpt4 key购买 nike

我正在处理结构和字符指针(字符串)。我想制作一个结构数组,这些结构有一个 char* ,和两个 int s。

尝试 fscanf 时出现段错误进arraystruct s。

这是我的代码的相关部分。

结构定义

typedef struct {
char* title;
int gross;
int year;
} Movie;

功能 我遇到了 的问题
Movie* createArray(char *filename, int size)
{

FILE *f;
f = fopen(filename, "r");
Movie* arr = (Movie*) malloc(sizeof(Movie) * size);
if(!arr){printf("\nAllocation Failed\n"); exit(1);}
for (int i =0; i<size; i++){
fscanf(f, "%s %d %d", (arr+ i)->title, &arr[i].gross, &arr[i].year);
}
fclose(f);
return arr;

}

补充一下,以防万一,这里是我调用函数的方式
        Movie* arr = createArray(file1, records);

最佳答案

title是一个未初始化的指针,你还需要为它保留内存,或者简单地声明 title作为 char array如果这是一个选项,则具有所需的尺寸。

还有一些我想在你的函数中解决的其他问题,其中一些你可能知道,下面的代码带有注释。

Movie* createArray(char *filename, int size)
{
FILE *f;

if(!(f = fopen(filename, "r"))){ //also check for file opening
perror("File not found");
exit(EXIT_FAILURE); //or return NULL and handle it on the caller
}

//don't cast malloc, #include <stdlib.h>, using the dereferenced pointer in sizeof
//is a trick commonly used to avoid future problems if the type needs to be changed
Movie* arr = malloc(sizeof(*arr) * size);

if(!arr) {
perror("Allocation Failed"); //perror is used to output the error signature
exit(EXIT_FAILURE);
}

for (int i =0; i<size; i++) {
if(!((arr + i)->title = malloc(100))){ // 99 chars plus null terminator,
perror("Allocation failed"); // needs to be freed before the array
exit(EXIT_FAILURE); //using EXIT_FAILURE macro is more portable
}

//always check fscanf return, and use %99s specifier
//for 100 chars container to avoid overflow
if(fscanf(f, "%99s %d %d", (arr+ i)->title, &arr[i].gross, &arr[i].year) != 3){
exit(EXIT_FAILURE); //or return NULL and handle it on the caller
}
}
fclose(f);
return arr;
}

关于c - 从文件读取时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61510742/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com