web-dev-qa-db-ja.com

グローバル変数が常にローカル変数ではなく、常に「0」に初期化されるのはなぜですか?

可能性のある複製:
なぜグローバル変数と静的変数がデフォルト値に初期化されるのですか?

コードを参照してください、

#include <stdio.h>

int a;
int main(void)
{
    int i;
    printf("%d %d\n", a, i);
}

出力

0 8683508

ここで、「a」は「0」で初期化されますが、「i」は「ジャンク値」で初期化されます。どうして?

51
yuvanesh

C Standardによれば、それがそうであるからです。その理由は効率です:

  • static変数はcompile-timeで初期化されます。これは、アドレスが既知であり固定されているためです。それらを0に初期化しても、ランタイムコストは発生しません。

  • 自動変数は呼び出しごとに異なるアドレスを持つことができ、runtimeで初期化する必要があります。関数が呼び出されるたびに、不要なランタイムコストが発生します。その初期化が必要な場合は、要求してください。

109
K-ballo

globalおよびstatic変数は、初期化されるとデータセグメント(DS)に格納され、初期化されていない場合はシンボルによるブロック開始(BSS) `に格納されます。

これらの変数のメモリ位置は固定されており、メモリはコンパイル時に割り当てられます。

したがって、global変数とstatic変数には'0'をデフォルト値として。

一方、auto変数はスタックに格納され、固定メモリ位置を持ちません。

メモリは実行時にauto変数に割り当てられますが、コンパイル時には割り当てられません。したがって、auto変数のデフォルト値はガベージです。

41

単純な変数を選択しましたが、以下を考慮してください。

void matrix_manipulation(void)
{
    int matrix1[100][100];
    int matrix2[100][100];
    int matrix3[100][100];

    /* code to read values for matrix1 from a file */
    /* code to read values for matrix2 from a file */
    /* code to multiply matrix1 by matrix2 storing the result in matrix3 */
    /* code to use matrix3 somehow */
}

システムが配列を0に初期化すると、労力が無駄になります。初期化は、残りの関数によって上書きされます。 Cは、可能な限り隠れたコストを回避します。

15

グローバル変数はmain関数が開始する前に割り当てられて初期化されますが、ローカル変数はプログラムのインスタンスの実行時にスタック上に生成されます。

7
WiSaGaN