静的記憶域クラスで定義された識別子は、その関数の実行中だけでなくプログラムの実行中すべてに渡って寿命を持ちます。
以下のプログラムでは、変数kを(static int k = 0)と宣言しています。この変数kはstaticで宣言された静的記憶域クラスの変数といえます。
この時、最初のtestの呼びだしにおける代入文(k = m * 10 + k)のkの値は初期値0でありますが、2回目の呼び出しでの代入文中のkの値は、前回の呼び出しによって格納されたkの値となります。この様に、静的記憶域クラスとすることにより、関数の中に固有の状態で、各々値を保存しておくことが可能となります。<プログラムリスト>
#include <stdio.h> int test(int m); int main(void) { int i, j; /* 自動的記憶域クラスをもつ変数i, j */ i = 10; j = test(i); printf("%d\n",j); j = test(i); printf("%d\n",j); } int test(int m) { static int k = 0; /* 静的記憶域クラスを持つ変数 k を 0 で初期化 */ k = m * 10 + k; return k; }<実行結果> 100 200
<注意点>
静的変数の場合は、初期化は上記のプログラムの様に、宣言と一緒に行なう必要があります。例えば (static int k = 0;) のように。
これを2つに分けて、例えば (static int k; k = 0;) とすると、(k=0)が関数の呼び出し毎に毎回実行され、保存されるべき値が保存されないので注意が必要です。