C 使用fread()将二进制文件转换为结构时出现问题
我在使用fread()将二进制文件转换为结构的链接列表时遇到问题 结构:C 使用fread()将二进制文件转换为结构时出现问题,c,struct,binaryfiles,fread,C,Struct,Binaryfiles,Fread,我在使用fread()将二进制文件转换为结构的链接列表时遇到问题 结构: struct MdbRec { char name[16]; char msg[24]; }; 相关代码: FILE *file; file = fopen( argv[1], "rb" ); struct List db; initList(&db); struct MdbRec *data = (struct MdbRec *)malloc(size
struct MdbRec {
char name[16];
char msg[24];
};
相关代码:
FILE *file;
file = fopen( argv[1], "rb" );
struct List db;
initList(&db);
struct MdbRec *data = (struct MdbRec *)malloc(sizeof(struct MdbRec));
struct Node *last;
while( fread( data, 40, 1, file ) )
{
struct MdbRec *message = (struct MdbRec *)malloc(sizeof(struct MdbRec));
message = data;
if( !db.head )
{
last = addFront( &db, message );
db.head = last;
}
else
last = addAfter( &db, last, message );
if( fseek( file, 40, SEEK_CUR ) != 0)
break;
printf("read\n");
}
free(data);
removeAllNodes( &db );
addFront()和addAfter是linkedlist结构的方法,mallocs将数据字段分隔开
当我用Valgrind运行它时,它显示我成功地分配了2个内存。一个显然是数据变量。其他568个字节,这让我很困惑。Valgrind说错误来自我运行fread()时。这是内存泄漏:
struct MdbRec *message = (struct MdbRec *)malloc(sizeof(struct MdbRec));
message = data;
由于消息
现在指向数据
,而不再指向现在无法访问的malloc()
d内存。我怀疑您实际上是想将数据
复制到消息
:
*message = *data;
其他要点:
- 使用前检查
的结果fopen()
- 似乎没有理由不为
数据使用堆栈分配的对象,这将避免对其进行不必要的动态分配管理
- 指定要读取的对象大小的
参数fread()
,容易出错。对40
的任何更改都会破坏它:请改用struct MdbRec
sizeof(struct MdbRec)
- 强制转换
的返回值是不必要的,并且可能是危险的(请参阅)malloc()
您重新分配了结构MdbRec,并将其丢弃。`message=data;`将覆盖您通过初始化器分配给消息的值。jae将是disappointed@Soke,如果你发现这个问题,他也会对你失望;)我在谷歌上找到这个“MdbRec”是因为我不明白“Rec”代表什么:PThanks,这似乎奏效了。我添加了fopen()检查,但问题并不存在。其他错误是最初正确的,但在调试过程中发生了变化。正如hmjd指出的,我的意思是将数据复制到消息中。我不想丢弃它。我错了,谢谢你的帮助。
struct MdbRec *message = (struct MdbRec *)malloc(sizeof(struct MdbRec));
message = data;