2011-12-18 15 views
-1

構造体の配列を静的に宣言した場合と同じように参照できるように、構造体の配列を動的に割り当てようとしています。私はcalloc()が割り当てられたメモリをすべて0に初期化するという追加のステップを行うことを理解しています。しかし、それ以外のコードは次のコードに対して完全に互換性がありますか? fread()とfwrite()を使用してこれらのデータ構造をファイル内外に取得する場合、calloc()はこれを助けるか妨げますか?calloc、malloc、および動的構造体割り当て

#define MAGIC 13 
    struct s_myStruct { 
int a[6000][400]; 
int b[6000][400]; 
int c[6000][400]; 
}; 

struct s_myStruct stuff[MAGIC]; 
vs 
struct s_myStruct *stuff = calloc(MAGIC, sizeof(s_myStruct); 

ありがとうございます。

+1

これはファイルと何が関係していますか? – Joe

+1

配列に "universal zero initializer"を使うこともできます: 'struct s_myStruct stuff [MAGIC] = {0};' – pmg

答えて

1

これらは同じではありません。このように、データを宣言:あなたは関数スコープでそれを宣言している場合

struct s_myStruct stuff[MAGIC]; 

が初期化されていないメモリを残す(あなたがでなければならない、2番目の選択肢を与えられました)。セミコロンの前に= {0}を追加すると、これが修正されます。

callocを使用する2番目の選択肢は、ヒープ上のメモリを割り当てます。

ただし、常に違いがあります。sizeof(stuff)は、最初のケースでは13 * sizeof(struct s_myStruct)になり、2番目のケースではポインタのサイズになります。

+0

あなたは、2つのケースが完全に異なっていると言っていますか?2番目のケースでは、私がしたことは構造体へのポインタではなく構造体へのポインタを格納することです。したがって、私は構造体のための記憶域を割り当てる別のステップが必要でしょうか? – PaeneInsula

+0

いいえ、彼らはほとんど同じです - 私はいくつかの違いを列挙しました。 –

+0

OK。ご協力いただきありがとうございます。 – PaeneInsula

0

スタックに13 * 3 * 6000 * 400 * 4 = 370MBを置くと、実際に最初のものを実行したくないです。

これは、freadfwriteを使用することとは関係ありません。

+0

スタックに[MAGIC]を入れるつもりはありませんでした。それはグローバルです。 – PaeneInsula

+0

@ user994179:その場合、ある時点で動的バージョンを「フリー」する必要がある以外は、実践上の違いはほとんどありません。また、@ Paulが彼の答えで言及しているように、配列とポインタには微妙な動作の違いがあります。 –

+0

ここで私の無知を間違いますが、Paulが言っているように、私はストラクチャ自体ではなくストラクチャへのポインタのためにストレージを割り当てているだけで、私が提示した2つのケース(静的と動的)は全く異なっており、そうでなければ動的なルートを使いたいのですか? – PaeneInsula