【问题标题】:How to get the size of a structure with dynamically allocated content ? (C)如何获取具有动态分配内容的结构的大小? (C)
【发布时间】:2016-10-15 16:29:14
【问题描述】:

我目前面临一个问题,我想将结构保存在二进制文件中,但结构的大小似乎每次都是错误的。

这是我的结构代码:

typedef struct {

    int lines;
    int columns;
    int ** matrix;

    char * name;

} labyrinthe;

这就是我将它保存在文件中的方式:

void writeInFile (labyrinthe * l, FILE * f) {
    fwrite(l, sizeof(l), 1, f); //already tried with &l instead of l
}

但是,即使矩阵大小是 111*111 网格,该文件也始终包含 22 个字节。任何帮助将不胜感激。

感谢阅读。

【问题讨论】:

  • L 是一个指针,您正在获取所述指针的大小。在 sizeof 中尝试 *l。但是你有更大的问题,因为你的结构也包含指针。你需要以某种方式编组它,这并不容易。
  • 您不会以这种方式保存数据,它必须与struct 一样归档,但指针将无关紧要。数据不是结构的一部分,只是指向数据实际在内存中的位置的指针。当您稍后读回数据时 - 您将不得不再次分配内存,就像您最初所做的那样。所以你必须以这样一种方式归档数据,当你从文件中读回数据时,你可以重新创建你拥有的数据结构。

标签: c struct binaryfiles


【解决方案1】:

嗯,实际上结构存储的正是您告诉它存储的内容,即:

2 个 int,一个 int 指针(指向另一个指针)和一个指向 char 的指针 而且我认为在您的系统上 sizeof(int)=4 和 sizeof(type*)=8 这就是为什么您的文件中有 24 个字节。

为了更清楚,看看这个:

#include<stdlib.h>
#include<stdio.h>
typedef struct {    
    int lines;
    int columns;
    int ** matrix;
    char * name;    
} labyrinthe;

int main(void) 
{
  FILE *f = fopen("file","w+b");
  labyrinthe *l;
  l=malloc(sizeof(labyrinthe));
  l->lines=1;
  l->columns=2;
  l->matrix = 0xABCDABCDABCDABCD;
  l->name = 0x5000B00B;
  fwrite(l, sizeof(*l), 1, f);

  return 0;
}

文件的十六进制转储看起来像这样(字节顺序因字节序而切换)

|lines4b | columns 4b | matrix 8 bytes      | name 8 bytes     |
0001 0000  0002 0000    abcd abcd abcd abcd b00b 5000 0000 0000 

矩阵和名称中的实际内容存储在内存中的另一个位置,结构中的那些指针只是指向那个位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-13
    • 2015-04-28
    • 1970-01-01
    • 2019-06-27
    • 2020-05-05
    • 1970-01-01
    • 2020-10-03
    相关资源
    最近更新 更多