【C言語】static付き変数を初期化しない場合の挙動について解説

この記事では、C言語におけるstatic変数の初期化しない場合の挙動と注意点について解説します。

目次から探す

static変数の初期化しない場合の挙動

プログラミングにおいて、static変数は関数内で定義された場合や、グローバルスコープで定義された場合に使用されます。

static変数は、その変数が定義されたスコープ内でのみ有効であり、関数が呼び出されるたびに初期化されるのではなく、プログラムの実行中に値が保持される特徴があります。

初期化しない場合の値の不定性

static変数を初期化しない場合、その変数の値は不定となります。

つまり、何の値が格納されているかは予測できません。

このため、プログラムの実行結果が不安定になる可能性があります。

例えば、以下のようなコードを考えてみましょう。

#include <stdio.h>
void func() {
    static int count;
    count++;
    printf("count: %d\n", count);
}
int main() {
    func();
    func();
    func();
    return 0;
}

このコードでは、関数func内でstatic変数countを定義し、その値をインクリメントして表示しています。

しかし、count変数を初期化していないため、最初の呼び出し時のcountの値は不定です。

実行結果は以下のようになる可能性があります。

count: 1
count: 2
count: 3

しかし、もし初期化されていないcount変数が0で初期化されていた場合、以下のような結果が得られるかもしれません。

count: 1
count: 2
count: 3

このように、初期化しない場合は値の不定性が生じるため、プログラムの挙動が予測できなくなる可能性があります。

プログラムの実行時に値が保持される仕組み

static変数は、関数内で定義された場合でも、その値が関数の呼び出し間で保持される特徴があります。

これは、static変数が静的データ領域に格納されるためです。

通常の変数は、関数が呼び出されるたびにその値が初期化されますが、static変数はプログラムの実行中に値が保持されるため、関数が呼び出されるたびに初期化されることはありません。

この特性を利用することで、関数内でのカウンタやフラグの管理などに便利に使用することができます。

static変数の初期化しない場合の注意点

static変数を初期化しない場合、以下のような注意点があります。

初期化しない場合の予期せぬバグの発生

static変数を初期化しない場合、その値が不定となるため、プログラムの挙動が予測できなくなります。

不正な値が格納されている場合、予期せぬバグが発生する可能性があります。

例えば、static変数がポインタ型であり、初期化されていない場合、不正なメモリアクセスが発生する可能性があります。

これは、プログラムの安定性やセキュリティに悪影響を及ぼす可能性があります。

初期化しない場合のセキュリティ上のリスク

static変数を初期化しない場合、その値が不定となるため、セキュリティ上のリスクが生じる可能性があります。

例えば、static変数がパスワードや暗号鍵などの重要な情報を格納している場合、不正なアクセスによってその値が漏洩する可能性があります。

そのため、セキュリティ上の重要な情報を扱う場合には、static変数の初期化に注意する必要があります。

目次から探す