我有一个下面的示例文件,其中我将二进制文件读入结构并打印存储在结构中的字符串的长度。但是当我尝试打印完整的字符串时,我得到了一个分段故障核心。我找不到它的原因。
#include <stdio.h>
#include <stdlib.h>
struct sample {
unsigned int m;
unsigned int v;
unsigned int s[128];
int t_length;
char *t;
};
int main()
{
int i=0;
unsigned int t_len=0;
FILE *fp;
struct sample sam;
fp =fopen("sample.bin", "rb");
if (fp==NULL) {
printf("File not created\n");
return -1;
}
fread(&sam, sizeof(sam), 1, fp);
printf("t_length is %d\n", sam.t_length);
t_len=sam.t_length;
sam.t=(char *)malloc(sizeof(char) * t_len);
fseek(fp,0,SEEK_SET);
fread(&sam, sizeof(sam)+t_len, 1, fp);
printf("t_length is %d\n", t_len);
printf("%s\n", sam.t);
fclose(fp);
free(sam.t);
return 0;
}
答案 0 :(得分:3)
请考虑以下几行:
fread(&sam, sizeof(sam), 1, fp);
// ...
sam.t=(char *)malloc(sizeof(char) * t_len);
// ...
fread(&sam, sizeof(sam)+t_len, 1, fp);
您阅读了结构。您分配t
成员。然后再次阅读该结构, 覆盖 t
成员。
这将导致t
成员不再指向您分配的内存,并在取消引用指针时导致undefined behavior。
我建议您对flexible array members进行一些研究,因为这可能会解决您的问题。这当然要求程序写文件也要改为使用灵活的数组成员。
如果您无法修改编写文件的程序,请不要重新阅读该结构。读取一次结构,分配内存,然后只读取 要放入分配的内存中的数据。跳过搜索,因为文件应该在正确的位置。
在类似
的代码中fread(&sam, sizeof sam , 1, fp);
sam.t = malloc(samr.t_length);
fread(sam.t, sam.t_length, 1, fp);