57

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

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

#include <stdio.h>

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

出力

0 8683508

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

4

4 に答える 4

122

C Standardによると、それがその方法だからです。その理由は効率です。

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

  • 自動変数は呼び出しごとに異なるアドレスを持つことができ、関数が呼び出されるたびに実行時に初期化する必要があり、不要な実行時コストが発生する可能性があります。その初期化が必要な場合は、リクエストしてください。

于 2012-12-27T05:31:38.237 に答える
16

単純な変数を選択しましたが、次のことを考慮してください。

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 は、可能な限り隠れたコストを回避します。

于 2012-12-27T05:40:32.543 に答える
6

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

于 2012-12-27T05:31:51.190 に答える