という記事を書いたのですが、とにかくstatic変数というのははじめに初期化したあとは確保された値が開放されないのだ と学びました。
具体的なプログラムを改めて書いてみます。
#include <stdio.h>
int f_num = 0;
void func(int num){
int i_num = 0;
static int s_num = 0;
f_num++;
i_num++;
s_num++;
printf("外部変数f_num=%d, 内部変数i_num=%d, スタティック変数s_num=%d\n", f_num, i_num, s_num);
}
int main(void)
{
int n;
for(n = 0;n < 8;n++){
func(n);
}
return 0;
}
で、実行結果がこれ
関数内で宣言したi_numは処理から抜けるごとに、0で再初期化されてインクリメントされてもまた0に戻るため、表示は1のまま。
そして、static宣言されたs_numは最初に0で初期化されたあとは、処理にはいっても再初期化されずに、インクリメントされた値を保持し続けている。
※外部変数とstatic変数は初期化処理をせずとも上記と同じ結果になる。
それは、「初期化子が指定されていない静的記憶域期間をもつオブジェクトは、0で初期化される」から。
なるほど・・・。