142

次のような構造体がある場合:

typedef struct
{
    unsigned char c1;
    unsigned char c2;
} myStruct;

この構造体を 0 に初期化する最も簡単な方法は何でしょうか? 以下で十分でしょうか?

myStruct _m1 = {0};

または、各メンバーを明示的に 0 に初期化する必要がありますか?

myStruct _m2 = {0,0};
4

4 に答える 4

164

最初の方法は最も簡単で (タイピングが少なくて済みます)、動作することが保証されており、すべてのメンバーが0[Ref 1]に設定されます。
2 番目の方が読みやすいです。

どちらを選択するかは、ユーザーの好み、またはコーディング標準で義務付けられているものによって異なります。

[参照 1] 参照 C99 標準 6.7.8.21:

集合体の要素またはメンバーよりもブレースで囲まれたリスト内の初期化子が少ない場合、または配列内の要素よりも既知のサイズの配列を初期化するために使用される文字列リテラル内の文字が少ない場合、集合体の残りの部分は静的ストレージ期間を持つオブジェクトと同じように暗黙的に初期化されます。

よく読んでください:
C および C++ : 自動構造の部分的な初期化

于 2012-06-22T07:51:25.030 に答える
40

データが静的変数またはグローバル変数の場合、デフォルトでゼロで埋められるため、宣言するだけですmyStruct _m;

データがローカル変数またはヒープ割り当てゾーンの場合は、次のmemsetようにクリアします。

memset(&m, 0, sizeof(myStruct));

現在のコンパイラ (たとえば の最近のバージョンgcc) は、実際にはそれを非常にうまく最適化します。これは、すべてのゼロ値 (null ポインターと浮動小数点ゼロを含む) がすべてゼロのビットとして表されている場合にのみ機能します。これは、私が知っているすべてのプラットフォームで当てはまります (ただし、C標準では、これが false である実装が許可されています。そのような実装は知りません)。 .

おそらくmyStruct m = {};or をコーディングできますmyStruct m = {0};(の最初のメンバーがmyStructスカラーでなくても)。

私の感じではmemset、ローカル構造を使用するのが最善であり、実行時に何かを行う必要があるという事実をよりよく伝えます (通常、グローバルおよび静的データは、実行時にコストをかけずに、コンパイル時に初期化されると理解できます)。 .

于 2012-06-22T07:51:59.040 に答える
23

§6.7.9 初期化を参照してください。

21 集合体の要素またはメンバーよりもブレースで囲まれたリスト内の初期化子が少ない場合、または配列内の要素よりも既知のサイズの配列を初期化するために使用される文字列リテラル内の文字が少ない場合、集合体の残りの部分静的ストレージ期間を持つオブジェクトと同じように暗黙的に初期化されます。

はい、両方とも機能します。C99 では、指定された初期化と呼ばれる新しい初期化方法も使用できることに注意してください。

myStruct _m1 = {.c2 = 0, .c1 = 1};
于 2012-06-22T07:54:53.890 に答える