WisdomSoft - for your serial experiences.

7.12 静的変数

通常のローカル変数は関数が終了すると値を失いますが static 指定子を用いた静的変数は永続的な寿命を持ちます。関数内でのみ使えるローカル変数でありながら、グローバル変数と同様にアプリケーションが終了するまで変数の値を保持し続けます。

7.12.1 永続的なローカル変数

通常、関数の内部で宣言された関数はローカルな寿命を持ちます。それは、関数が実行される時に初期化され、関数が制御を返すときに開放されるというものです。これは、関数が計算を行うために必要な一時的な保存領域に適しています。

しかし、時にプログラムはより複雑な、長期的な処理を求められることがあります。例えば、その関数が何度呼び出されているかを保存しなければならないという要求が与えられた場合、どうするべきでしょうか。関数の参照回数を数えるには、その関数の内部で専用のカウンタ変数をインクリメントするという方法がもっとも確実ですが、問題はこの変数の記憶クラスです。

自動変数であれば、関数が終了した時に情報が失われてしまいます。これでは、自分が何度呼び出されているかを管理することができないため、グローバル変数としてカウンタを使うことが考えられます。しかし、グローバル変数は他の関数から不正に値を変更されてしまう可能性があります。関数が、このグローバル変数を使って参照回数を数えても、本当にその値が正しいかどうかは保証することができません。

そこで、静的変数を用います。静的変数は自動変数と異なり永続的な寿命を持ちます。すなわち、グローバル変数のようにプログラムの開始時に初期化され、プログラムが終了するまで値を保持するというものです。関数の内部変数を静的変数として宣言することによって、関数が終了しても解放されない変数を作成することができます。しかも、この変数の可視性は自動変数と同じで、他の関数からアクセスすることはできません。静的変数を宣言するには static 指定子を使います。

static 指定子
static  変数名 ...

このように変数を宣言すれば、この変数はグローバルな寿命を持つことになります。関数の内部で宣言された場合、関数が終了しても変数が破棄されることはありません。関数の外、つまり外部レベルで宣言された場合については「7.13 外部レベル宣言」で詳しく紹介します。

コード1
#include <stdio.h>

void ShowCount(void) {
	static int iCount = 0;
	printf("iCount = %d\n" , iCount++);
}

int main() {
	ShowCount();
	ShowCount();
	ShowCount();
	return 0;
}
実行結果
コード1 実行結果

コード1の ShowCount() 関数は、この関数の参照回数を表示します。関数の参照回数を記憶するために、関数の内部で static 記憶クラスを持つ数値型変数 iCount を宣言しています。通常の変数は関数が呼び出されるたびに初期化されてしまいますが、この変数は static を持つ静的変数なので初期化は一度しか行われません。実行結果から確認できるように、関数を呼び出すごとに静的変数 iCount をインクリメントすることで、参照回数を正確に保存しています。

static を指定した静的変数は、このほかにも初期化の負担を緩和する手段として用いられます。常に同じ値を示す変数の場合は、関数を実行するたびに初期化するというオーバーヘッドを回避することができるでしょう。常に同じ文字列を表す char 型配列などに有効です。