web-dev-qa-db-ja.com

初期化されていない整数は、cでは常にデフォルトで0になっていますか?

Nginxのソースコードを読んでいますが、ngx_int_t ngx_last_process;を含む多くの数値変数を初期化していないことがわかりました。ここでは、ngx_int_tlong intとして定義されています。

#if 0
    ngx_last_process = 0;
#endif

それで、ここで@Igor Sysoevは、初期化を行う必要はないと思いますか?

ただし、プログラムでは、デフォルト値が0であると想定しています。

    for (s = 0; s < ngx_last_process; s++) {
        if (ngx_processes[s].pid == -1) {
            break;
        }
    }

初期化されていない変数のcの値は0であることが保証されていますか?

23
cpuer

Externalおよびstatic変数はデフォルトでゼロに初期化されます。これは保証されています。 Automaticおよびregister変数には、明示的な初期化子がありません。不確定な値(不特定の値またはトラップ表現のいずれか)。

標準から:

C89

6.5.7:

静的ストレージ期間を持つオブジェクトが明示的に初期化されない場合、算術型を持つすべてのメンバーに0が割り当てられ、ポインター型を持つすべてのメンバーにnullポインター定数が割り当てられるかのように暗黙的に初期化されます。自動保存期間を持つオブジェクトが明示的に初期化されていない場合、その値は不確定です。

C99

6.2.4、§5:

可変長配列型を持たないそのようなオブジェクトの場合、その存続期間は、関連付けられているブロックへのエントリから、そのブロックの実行が終了するまで延長されます(囲まれたブロックへの入力または関数の呼び出しは中断されますが、中断されません)終了、現在のブロックの実行。)ブロックが再帰的に入力されると、オブジェクトの新しいインスタンスが毎回作成されます。オブジェクトの初期値は不定です。オブジェクトに初期化が指定されている場合、ブロックの実行で宣言に達するたびに初期化が実行されます。そうしないと、宣言に達するたびに値が不確定になります。

6.7.8、§10:

自動保存期間を持つオブジェクトが明示的に初期化されていない場合、その値は不確定です。静的ストレージ期間を持つオブジェクトが明示的に初期化されていない場合、次のようになります。

—ポインタ型の場合、nullポインタに初期化されます。

—算術タイプの場合、(正または符号なし)ゼロに初期化されます。

—集合体の場合、すべてのメンバーはこれらのルールに従って(再帰的に)初期化されます。

—ユニオンの場合、最初に指定されたメンバーは、これらのルールに従って(再帰的に)初期化されます。

3.17.2、§1:

不定値:不特定の値またはトラップ表現のいずれか

3.17.3、§1:

不特定の値:この国際規格がどのインスタンスでどの値を選択するかについての要件を課していない、関連するタイプの有効な値。注指定されていない値をトラップ表現にすることはできません。

29
Wiz

automatic(ローカル)変数はゼロであることが保証されておらず、ゴミが含まれている可能性があります。

global変数とstatic変数はゼロであることが保証されています。

4
phoxis

ファイルスコープで(intとして)宣言された変数は0に初期化されます。

int i;
int main()
{
   int x;
   printf("%d",i); // prints 0
   printf("%d",x); // prints some unspecified value
}

初期化されていない変数のcの値が0になることは保証されていますか?

いいえ!これは、関数スコープで宣言された変数には当てはまりません。

3
Prasoon Saurav

変数の割り当て方法によって異なります。静的に割り当てられた変数はゼロに初期化されますが、スタックまたはmalloc()で割り当てられた変数はゼロに初期化されません。

2
hammar