gpt4 book ai didi

c - 将 char 指针作为结构成员写入文件问题

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

我有一个结构成员作为 char * 并将其分配给结构初始化中的字符串文字“John”,如下所示。使用 printf 可以很好地打印字符串。

但是,如果我使用 fwrite 将此字符串写入文件,我会在文件中读回垃圾。

如果我使用 char 数组而不是 char *(如图所示在结构中注释掉),并将其写入文件,我可以按预期读回文件中的字符串。我不明白这个。在这两种情况下 fwrite 不应该采用指针并将正确的字符串写入文件吗?

此外,如果我声明一个单独的 char * 并将其指向一个字符串文字并将其写入文件,我可以按预期读回它。非常感谢您对解释的任何帮助。 (我在 Windows 上使用带有 Mingw 编译器的代码块 IDE)。

更新:包括实际使用的代码

int main()
{
struct person
{
//char name[20];
char* name;
int age;
};

struct person p1 = {"John", 25};

printf("%s\n", p1.name);
FILE* fp = fopen("test.txt", "w");
fwrite(&p1, 1, 10, fp);
fclose(fp);
return 0;
}

最佳答案

有了这个结构定义:

struct person
{
char* name;
int age;
};

以下代码不会执行您期望的操作:

struct person p1 = {"John", 25};

printf("%s\n", p1.name);
FILE* fp = fopen("test.txt", "w");
fwrite(&p1, 1, 10, fp);

原因是变量 p1: 的字节实际上并不包含字符串“John”,但它包含一个指向字符串“John”的指针,那是字符串“John”的内存地址。现在fwrite(&p1, 1, 10, fp);将从p1的内存地址开始写入10个字节,即(假设是32位系统):4个字节表示指针,它只是一些内存地址,4 个字节表示 1(年龄)和内存中不属于 p1 变量的 2 个字节。

现在如果结构定义如下:

struct person
{
char name[20];
int age;
};

情况完全不同。这次变量 p1 实际上确实包含字符串“John”。前 4 个字节包含字符 John 然后是 NUL 字符字符串终止符,然后是 15 个字节的未确定值。然后是代表age的4个字节。

在这种情况下,fwrite(&p1, 1, 10, fp); 将再次从 p1 的内存地址开始写入 10 个字节,但如上面的段落,前 4 个字节包含“John”,第 5 个字节包含 NUL 终止符,剩下的 5 个字节是不确定的值。

关于c - 将 char 指针作为结构成员写入文件问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41042480/

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