【发布时间】:2017-04-23 20:57:36
【问题描述】:
我有一个结构成员作为 char * 并将其分配给结构初始化时的字符串文字“John”,如下所示。使用 printf 可以很好地打印字符串。
但是,如果我使用 fwrite 将此字符串写入文件,我会在文件中读回垃圾。
如果我使用 char 数组而不是 char *(如图所示在结构中注释掉)并将其写入文件,我可以按预期读回文件中的字符串。我无法理解这一点。 fwrite 在这两种情况下都不应该获取指针并将正确的字符串写入文件吗?
此外,如果我声明一个单独的 char * 并将其指向一个字符串文字并将其写入文件,我可以按预期将其读回。非常感谢您提供任何解释帮助。 (我在 Windows 上使用带有 Mingw 编译器的 codeblocks 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;
}
【问题讨论】:
-
如何你如何写和读字符串来得到“垃圾”?您是否在单个
fwrite调用中编写了整个结构?请尝试为 failing 程序创建一个Minimal, Complete, and Verifiable Example 并向我们展示。 -
当你这样做时,你应该知道指针是特定于单个进程的,如果你在对
fwrite的一次调用中编写完整的结构,你就编写了指针 而不是它所指向的。fwrite函数对它写入的数据一无所知,它所拥有的只是一系列匿名字节。 -
我希望得到更优雅的回复。这是一个学习和帮助他人的地方,而不是傲慢自大。
-
你表现得很傲慢。要求 minimal reproducible example 的评论只是 SO 规则的应用。给一个,你会得到答案,解释什么是错误的以及如何解决它。但是没有它,我们只能尝试猜测,目前我不知道您的问题可能出在哪里。
-
我可以告诉你,写 10 个字节的
p1是没有意义的;该结构可能大于 10 个字节。您如何确定 10 是要写入的正确字节数?
标签: c pointers struct char fwrite