0

静的宣言を行った場合と同じように参照できるように、c で構造体の配列を動的に割り当てようとしています。calloc() は、割り当てられたすべてのメモリを 0 に初期化する追加のステップを実行することを理解しています。これらのデータ構造をファイルに出し入れするために fread() と fwrite() を使用している場合、calloc() はこれを助けたり妨げたりしますか?

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

ありがとうございました。

4

2 に答える 2

1

それらは同じではありません。次のようにデータを宣言します。

struct s_myStruct stuff[MAGIC];

関数スコープで宣言している場合、メモリは初期化されないままになります(2番目の選択肢がある場合は、メモリを初期化する必要があります)。= {0}セミコロンの前に追加すると、これが修正されます。

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

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

于 2011-12-18T18:20:58.130 に答える
0

13 * 3 * 6000 * 400 * 4 = 370MB をスタックに置くことになるので、最初のものは本当にやりたくありません。

freadしかし、これは and の使用とは関係ありませんfwrite

于 2011-12-18T18:12:38.387 に答える