gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:35:33 27 4
gpt4 key购买 nike

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

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com