将二进制文件读入结构变量,给出seg错误

时间:2017-09-12 06:13:03

标签: c file pointers struct

我有一个下面的示例文件,其中我将二进制文件读入结构并打印存储在结构中的字符串的长度。但是当我尝试打印完整的字符串时,我得到了一个分段故障核心。我找不到它的原因。

#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;

}

1 个答案:

答案 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);