2016-10-15 12 views
0

私は現在、構造体をバイナリファイルに保存したいという問題に直面していますが、構造体のサイズは毎回間違っているようです。ここで動的に割り当てられたコンテンツを持つ構造体のサイズを取得する方法は? (C)

は私の構造のコードです:

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 
} 

ただし、ファイルは常にさえ、正確に22バイトが含まれています行列の大きさが111 * 111グリッドの場合どんな助けでも本当に感謝しています。

読んでいただきありがとうございます。

+1

Lはポインタであり、上記のポインタのサイズをとっています。サイズ*で* lを試してください。しかし、あなたの構造体にもポインタが含まれているので、より大きな問題があります。あなたは何とかそれをマーシャルする必要があり、それは容易ではありません。 – Vality

+2

あなたはデータを保存しません。それは 'struct'と同様に提出する必要がありますが、ポインタは無関係です。データは構造体の一部ではなく、データが実際にメモリに格納されている場所へのポインタだけです。後でデータを読み込むときは、元のようにメモリを再割り当てする必要があります。そのため、ファイルから読み込んだデータ構造を再作成できるように、データをファイル化する必要があります。 –

答えて

4

まあ、正確に何を保存するためにそれを伝え、つまり実際の構造店:

2 int型、(別のポインタを指して)1つのint型のポインタと文字 へのポインタと、私はあなたの上だと思いますシステムのsizeof(int)= 4、sizeof(type *)= 8であり、そのためファイルに24バイトがあるのです。

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

(バイトオーダーが原因エンディアンの切り替え)の実際のコンテンツを

#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; 
} 

し、ファイルのhexdumpに対しては、次のようになります。それがより明確にこれを見てとるようにするに

マトリックス内にあるものと名前はメモリ内の別の場所に格納され、構造内のポインタはその場所を指し示します。

+0

ありがとう、私はまったく別のやり方でそれをしなければならないと思います... – MedAl

関連する問題