グローバル変数の初期化(C言語)

プログラミング

グローバル変数の初期化について確認します。初期化しなくても0で初期化されてたと、経験的に覚えている方も多いかと思います。

グローバル変数は自動で0で初期化される。が、しかし

まず、グローバル変数を初期化せずに参照してどんな値が入っているかを確認してみます。

#include <stdio.h>

int g[5];

void main(void)
{
    int i;
    for( i=0; i<5; i++ ){
        printf("%d\n",g);
    }
    return 0;
}

以外かもしれませんが、グローバル変数はプログラム実行時に1度だけ0で初期化されます。

$main
0
0
0
0
0

ただし、この挙動はC言語に忠実に作られたコンパイラの挙動ですが、コンパイラの種類やコンパイラに指定しているオプション、最適化設定によっては保証されない可能性があります。ですから、グローバル変数の初期化処理は念の為必ず入れるようにしてください。

もしも、色々やったけど初期化を忘れてた。でも、バグがでなかった。なぜ?と思ったときはこのC言語の仕様を知って奥と役に立つと思います。

グローバル変数を明示的に初期化も可能

ローカル変数と同様に明示的な初期化も可能です。この場合1度別の値に書き換えてしまうと、プログラムを実行し直さない限り自動では初期値には戻りません。

#include <stdio.h>

static int g[5]={0,1,2,3,};

void main(void)
{
    int i;
    for( i=0; i<5; i++ ){
        printf("%d\n",g[i]);
    }
    return;
}

$main
0
1
2
3
0

まとめ

  • グローバル変数の初期値はC言語に準拠していれば自動で0で初期化される
  • しかし、コンパイラの都合で0で初期化されない可能性があるから明示的に初期化すること

コメント

タイトルとURLをコピーしました