回答:
最初の方法が最も簡単で(入力の手間が減ります)、機能することが保証されており、すべてのメンバーが0
[参照1]に設定されます。
2番目はより読みやすくなっています。
どちらを選択するかは、ユーザーの好み、またはコーディング標準が要求するものによって異なります。
[参照1] 参照C99標準6.7.8.21:
ブレースで囲まれたリスト内の初期化子が集合体の要素またはメンバーよりも少ない場合、または既知のサイズの配列を初期化するために使用される文字列リテラルの文字が配列内の要素よりも少ない場合、集約の残りの部分は静的な保存期間を持つオブジェクトと同じように暗黙的に初期化されます。
よく読む:
CおよびC ++:自動構造の部分的な初期化
foo = {0}
意味するのか知っています。を見た場合foo = ZERO_FULL
、ZERO_FULLの定義をgrepする必要があります。
データが静的変数またはグローバル変数の場合、デフォルトでゼロで埋められるため、宣言するだけです myStruct _m;
データがローカル変数またはヒープ割り当てゾーンの場合は、次のmemset
ようにしてクリアします。
memset(&m, 0, sizeof(myStruct));
現在のコンパイラー(例えば、最新バージョンのgcc
)は、実際にはそれを最適化しています。これは、すべてのゼロ値(nullポインターと浮動小数点ゼロを含む)がすべてゼロのビットとして表される場合にのみ機能します。これは、私が知っているすべてのプラットフォームでtrueです(ただし、C標準では、これがfalseである実装を許可しています。そのような実装はわかっていません)。 。
あなたはおそらく、コーディングができmyStruct m = {};
たり myStruct m = {0};
(の最初のメンバーがあってもmyStruct
スカラーではありません)。
memset
ローカル構造に使用するのが最善であり、実行時に何かを実行する必要があるという事実をよりよく伝えます(通常、グローバルデータと静的データは、実行時にコストをかけずにコンパイル時に初期化されていると理解できます)。 。
0
すべてのstructメンバーを初期化することと同等であるという保証はありません0
。これは多くのプラットフォームで当てはまりますが、普遍的ではありません。
{}
は有効なCではなく、C ++でのみ使用できます。
NULL
すべての0
ビットではないポインタがあったプラットフォームのリストがあります:c-faq.com/null/machexamp.html。そして、プラットフォームが浮動小数点値を表すためにIEEE 754を使用していない可能性がありますが、全0
ビット0.0
値を持たない他の表現を使用していますが、確かに私はそのようなプラットフォームを知りません。
§6.7.9初期化を参照してください:
21ブレースで囲まれたリストの初期化子の数が集合体の要素またはメンバーの数より少ない場合、または既知のサイズの配列の初期化に使用される文字列リテラルの文字数が配列の要素の数より少ない場合、残りの集合体静的な保存期間を持つオブジェクトと同じように暗黙的に初期化されます。
つまり、どちらも機能します。C99では、指定された初期化と呼ばれる新しい初期化方法も使用できることに注意してください。
myStruct _m1 = {.c2 = 0, .c1 = 1};
= {};
していますが、これが有効かどうかはわかりません。