42

Cでの静的変数の初期化について質問があります。デフォルトで値がであるグローバル静的変数を宣言するかどうかはわかります0。例えば:

static int a; //although we do not initialize it, the value of a is 0

しかし、次のデータ構造についてはどうでしょうか。

typedef struct
{
    int a;
    int b;
    int c;
} Hello;

static Hello hello[3];

hello[0]、、の各構造体のすべてのメンバーは?hello[1]としてhello[2]初期化され0ますか?

4

5 に答える 5

60

はい、すべてのメンバーは静的ストレージを持つオブジェクト用に初期化されます。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
于 2012-11-06T12:33:37.430 に答える
2

はい、静的またはスレッドの保存期間がある限り、そうです。

C11(n1570)、§6.7.9初期化#10

静的またはスレッドの保存期間を持つオブジェクトが明示的に初期化されていない場合、次のようになります。

[...]

  • 算術タイプの場合、(正または符号なし)ゼロに初期化されます。
  • 集合体の場合、すべてのメンバーはこれらのルールに従って(再帰的に)初期化され、パディングはすべてゼロビットに初期化されます。

[...]

于 2012-11-06T12:34:12.033 に答える
2

はい、ファイルスコープの静的変数は、構造体、配列などのすべてのメンバーを含めて、ゼロに初期化されます。

参考のためにこの質問を参照してください(私もこれを重複として閉じることに投票します)。


編集:この質問ははるかに良い答えを得ているので、代わりに、この質問の複製としてその質問を閉じることに投票します。

参考までに、ここにその質問の受け入れられた回答からのC FAQリンクがありますが、もちろんここにリンクされているC99およびC11標準は標準です。

于 2012-11-06T12:36:15.337 に答える
1

静的変数(または配列)は2つのタイプに分類されることを付け加えておきます。

初期化されるのは、コンパイル時にコードから値が与えられるものです。これらは通常DSに格納されますが、これはコンパイラ固有です。

もう1つのタイプは、実行時に初期化され、BSSセグメントに格納される初期化されていない統計ですが、これもコンパイラ固有です

BSS

于 2012-11-06T12:39:36.720 に答える
0

標準を読みたくない人のために、それはhttps://en.cppreference.com/w/c/language/initializationにも記載されています:

暗黙的な初期化

イニシャライザが提供されていない場合:

  • 自動保存期間のあるオブジェクトは、不確定な値(トラップ表現の場合があります)に初期化されます。
  • 静的およびスレッドローカルストレージ期間を持つオブジェクトはゼロで初期化されます
于 2021-02-20T08:43:13.773 に答える