gpt4 book ai didi

c - 结构中包含 char* 指针的二进制文件读/写错误

转载 作者:太空宇宙 更新时间:2023-11-04 00:30:14 25 4
gpt4 key购买 nike

我有一个奇怪的问题。我猜不出为什么会这样。我尝试了各种方式。可能是因为我还是c语言的新手。

请看下面的代码。

它带有 2 个参数。 --写入--读取

  • 在我的 write() 函数中,我写入文件,然后调用 read() 函数。这会将数据写入文件并按预期正确打印 3 行值。

  • 在我的 read() 函数中,我读取了文件。当我单独传递 --read 参数时,程序给出了 segmentation fault 错误消息。尽管在下面的代码中,如果我将静态字符串值分配给 char *name,此读取函数将按预期工作。

下面是我为模拟我的问题而创建的完整代码。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct _student {
int id;
char *name;
} Student;

void write();
void read();

int main(int argc, char *argv[])
{
if (argc > 1) {
if (strcmp(argv[1], "--write") == 0) {
write();
read();
}
else if (strcmp(argv[1], "--read") == 0) {
read();
}
}
return 0;
}

void write()
{
printf("Write\n");
FILE *fp;

// write student
Student *std_writer = (Student *) malloc(sizeof(Student));
std_writer->id = 10;
//std_writer->name = "Alice"; // But if i remove the below 4 lines and uncommented this line, everything works as expected.
char *a = "Alice";
std_writer->name = malloc(20);
memset(std_writer->name, '\0', 20);
strncpy(std_writer->name, a, 5);

fp = fopen("Student.file", "wb");
fwrite(std_writer, sizeof(Student), 1, fp);
fwrite(std_writer, sizeof(Student), 1, fp);
fwrite(std_writer, sizeof(Student), 1, fp);
fclose(fp);

free(std_writer);
}

void read()
{
printf("Read\n");
FILE *fp;

// read student
Student *std_reader = (Student *) malloc(sizeof(Student));
fp = fopen("Student.file", "rb");
while(fread(std_reader, sizeof(Student), 1, fp) == 1) {
printf("ID %i \tName : %s\n", std_reader->id, std_reader->name);
}
fclose(fp);

free(std_reader);
}

请帮助我理解并解决这个问题。

编辑

好的,根据我理解的以下答案,我按如下方式更新了我的 Student 结构。

typedef struct _student {
int id;
char name[20];
} Student;

这行得通。

有什么意见吗?

最佳答案

请注意,您没有将学生的姓名写入文件。您只是在写指向该字符串的指针。当然,这不是您想要的。当您读取文件时,您正在读取不再有效的指针。

要么将整个字符串放入您的结构中(不是字符指针,而是字符数组),否则您应该将字符串单独写入文件。

关于c - 结构中包含 char* 指针的二进制文件读/写错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22434331/

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