gpt4 book ai didi

c - FILE* 行为在函数内部发生变化

转载 作者:行者123 更新时间:2023-11-30 18:45:00 25 4
gpt4 key购买 nike

我正在尝试将一个结构以二进制方式写入文件,然后使用第二个元素初始化另一个结构。当我在函数内部定义 FILE *fptr 时效果很好,但是当我如图所示从外部传递它时,我在 fread() 函数中收到了 seg 错误。为什么会发生这种情况?提前感谢您的帮助!

typedef struct Person
{
int id;
char name[30];
int age;
}Person;

int ex3(FILE *fptr);

int main()
{
FILE *fptr;
return ex3(fptr);
}
int ex3(FILE *fptr)
{
Person personArr1[] = {{1, "Seinfeld", 29},
{2, "George", 32},
{3, "Elain", 28}};
Person *singlePerson;
unsigned int i;

/* write struct into file */
if (!(fptr = fopen(FILE1, "wb+")))
{
fprintf(stderr, "COULD NOT WRITE INTO FILE. ABORT.");
return ERR_CODE;
}
fwrite(&personArr1, sizeof(Person), sizeof(personArr1) / sizeof(personArr1[0]), fptr);
fclose(fptr);

if (!(fptr = fopen(FILE1, "rb+")))
{
fprintf(stderr, "COULD NOT WRITE INTO FILE. ABORT.");
return ERR_CODE;
}
/* go into second element position */
fseek(fptr, sizeof(Person), SEEK_SET);
/* initalize new struct values */
fread(singlePerson, sizeof(Person), 1, fptr);
fclose(fptr);`enter code here`

printf("%d %s %d\n", singlePerson->id, singlePerson->name, singlePerson->age);
return 0;
}

最佳答案

singlePerson 没有指向任何地方:

Person *singlePerson;
...
fread(singlePerson, sizeof(Person), 1, fptr);

因此,fread 正在尝试读取并取消引用未初始化的指针。这会调用 undefined behavior ,在您的情况下,有时会崩溃,但其他时候则不会。

这里不需要指针。只需将 singlePerson 声明为 Person 的实例并传递其地址即可。

Person singlePerson;
...
fread(&singlePerson, sizeof(Person), 1, fptr);

关于c - FILE* 行为在函数内部发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55972054/

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