はい、すべてのメンバーは静的ストレージを持つオブジェクト用に初期化されます。C99標準(PDFドキュメント)の6.7.8/10を参照してください。
自動保存期間を持つオブジェクトが明示的に初期化されていない場合、その値は不確定です。静的ストレージ期間を持つオブジェクトが明示的に初期化されていない
場合、次のようになります。—ポインター型の場合、nullポインターに初期化されます。
—算術タイプの場合、(正または符号なし)ゼロに初期化されます。
—集合体の場合、すべてのメンバーはこれらのルールに従って(再帰的に)初期化されます。
—ユニオンの場合、最初に指定されたメンバーは、これらのルールに従って(再帰的に)初期化されます。
オブジェクト内のすべてを、それがそうであるかどうかにかかわらず、0に初期化するには、ユニバーサルゼロ初期化子static
を使用するのが好きです
sometype identifier0 = {0};
someothertype identifier1[SOMESIZE] = {0};
anytype identifier2[SIZE1][SIZE2][SIZE3] = {0};
Cには部分的な初期化はありません。オブジェクトは完全に初期化されているか(0
別の値がない場合は正しい種類に)、まったく初期化されていません。
部分的な初期化が必要な場合、最初から初期化することはできません。
int a[2]; // uninitialized
int b[2] = {42}; // b[0] == 42; b[1] == 0;
a[0] = -1; // reading a[1] invokes UB