変数の寿命

関数内で生き残る変数

MMGames

static、静的なローカル変数



静的なローカル変数の寿命


ローカル変数、グローバル変数と、寿命の異なる変数を取り上げてきましたが、
実は、この2つの中間的な存在である、変わった特徴を持つ変数が存在します。

関数内で変数を宣言する時に、型名の前にstatic(スタティック)とつけることで、
静的なローカル変数を宣言することが出来ます。
次のプログラムは、静的なローカル変数を宣言した例です。

#include <stdio.h>

int countfunc(void);

int main(void)
{
	countfunc();
	countfunc();
	countfunc();
	return 0;
}
int countfunc(void)
{
	static int count; /* 静的なローカル変数 */
	count++;
	printf("%d\n",count);
	return count;
}
このプログラムの実行結果は、次の通りになります。

1
2
3
関数内で宣言したにもかかわらず、呼び出し毎に値が1ずつ増えていますし、
初期化も行っていないのに、始めの値が0になっています。
これは、どう見てもグローバル変数にしか見えません。

しかし、変数countは関数内で宣言されている以上、ローカル変数です。
実際、main関数内で変数countを使用すると、エラーとなります。

これが、静的なローカル変数の特徴です。
関数内で宣言されているので、使用出来るのは宣言された関数内のみですが、
その値はプログラムが終了するまで残るのです。
また、特に初期化しなくても、自動的に0に初期化されます。

なお、初期化は初めに1回だけしか行われませんので、
例えば、次のように初期化を行った場合もカウント出来ます。

static int count = 0; /* 静的なローカル変数 */
この変数は、関数が以前に呼び出された時の値を覚えておきたい場合に使用されます。
使い道は限られますが、関数の呼び出し回数を数える場合や、
検索を行う関数で、以前に見つかった文字位置を記憶する場合などが考えられます。

サイト目次


第0部:プログラム概要編

  1. プログラムとは何か?

2章:プログラムの書き方

  1. 書き方のルール
  2. 書き方の慣習
  3. 練習問題2

3章:画面への表示

  1. 文字列の表示
  2. 改行文字
  3. 練習問題3

6章:キーボードからの入力

  1. 入力用の関数
  2. 入力の恐怖
  3. 練習問題6

9章:回数が決まっている繰り返し

  1. 繰り返しを行う文
  2. ループ動作の仕組み
  3. 練習問題9

10章:回数がわからない繰り返し

  1. 回数不明ループ
  2. 入力チェック
  3. 練習問題10

13章:複数の変数を一括して扱う

  1. 複数の変数をまとめて扱う
  2. 配列の使い方
  3. 練習問題13

20章:複数のソースファイル

  1. 最小限の分割
  2. 分割の定石
  3. 練習問題20