c - 将二进制文件读入结构变量,出现段错误

标签 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;

}

最佳答案

考虑以下几行:

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

关于c - 将二进制文件读入结构变量,出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46169132/

相关文章:

c++ - 在 C++ 中使用指针序列化一个类

C 从指向 uint32_t 的指针转换为指向包含 uint32_t 的 union 的指针

c - 计算C中的字符串长度

c - 锁定文件。首先做什么?解锁还是关闭?

在C++中将0复制为000?

c - 如何创建一个接口(interface)来为 fortran 转换 c 字符数组

c++ - vs2017 输出错误但 mingw 有效

java - 使用 FileOutputStream 时的双文件名

linux - 如果 block 设备已经格式化,则退出 mkfs 命令

c - Typedefed 数组类型不可分配