C 使用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

我在使用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(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;