【发布时间】:2017-03-25 01:02:22
【问题描述】:
char* full_string;
int size;
FILE* f = fopen(filename,"r");
fseek(f,0,SEEK_END);
size = ftell(f);
fseek(f,0,SEEK_SET);
full_string = malloc(size+1);
fread(full_string,1,size,f);
fclose(f);
full_string[size] = '\0';
我正在尝试使用上述代码将文件的内容读取到名为“full_string”的缓冲区中,但是当我在 gdb 中逐步执行时,我发现以下内容存储在“full_string”中:
full_string = 0xa46df0 "\377\330\377", <incomplete sequence \340>
我完全是 C 新手,所以我不知道如何解释这个问题。值得一提的是,我正在阅读的文件是图像文件。这些图像中的大多数大小为 50,000 字节或更大。任何帮助将不胜感激!
【问题讨论】:
-
您希望在
full_string中出现什么?调试器试图将其解释为字符串,但图像不是字符串。因此,您的 code 可能没问题,但您的 debugger 可能会感到困惑。 -
@ScottHunter 或者只是无法显示这么大的字符串
-
“字符串”是一堆以 0 结尾的字节,存储在
char *中(或char[]在传递给事物时衰减为char *)。如果您输入的不是那种非常特定的格式,那么您不是在制作字符串,而是在制作字节序列。不过,GDB 并不知道您没有创建字符串。怎么可能?因此它假定它是一个字符串,并且在将其解释为字符串时会出错,因为它不是一个字符串。 -
@QPaysTaxes 我明白了,我认为这可以解决问题。由于上述问题以及 strlen() 返回 4 的事实,我假设 char 数组实际上并未保存数据,但如果它被误解为长度为 4 的字符串,这是有道理的。感谢所有帮助!
-
我已经把我的评论变成了答案。你能通读一遍并确保它仍然解释了它应该解释的一切吗?