2

我无法使用 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 是链表结构的方法,用于分配数据字段的空间。

当我用 Valgrind 运行它时,它表明我成功地分配了 2 个内存。一个显然是数据变量。其他 568 个字节让我很困惑。Valgrind 说错误来自我运行 fread() 时。

4

2 回答 2

1

这是内存泄漏:

struct MdbRec *message = (struct MdbRec *)malloc(sizeof(struct MdbRec));
message = data;

as messageis 现在指向data并且不再指向刚刚的malloc()d 内存,现在无法访问。我怀疑您实际上是要复制 datamessage

*message = *data;

其他要点:

  • 使用前检查结果fopen()
  • 似乎没有理由不使用堆栈分配的对象data,这将避免对其进行不必要的动态分配管理。
  • fread()指定要读取的对象大小的参数 ,容易40出错。任何更改struct MdbRec都会破坏它:sizeof(struct MdbRec)改为使用。
  • 强制转换 of 的返回值malloc()是不必要的,并且可能很危险(请参阅Do I cast the result of malloc?)。
于 2012-10-21T19:59:53.510 回答
1
struct MdbRec *message = (struct MdbRec *)malloc(sizeof(struct MdbRec));
message = data;

您重新分配了 astruct MdbRec并丢弃了它。

于 2012-10-21T19:59:55.557 回答