記憶クラス

変数のスコープと記憶クラス

C言語の変数は、グローバル変数、ローカル変数などの種類がありますが、それらは、それぞれデータが記憶される領域が異なります。その記憶領域のことを、「記憶クラス」と言います。ここでは、変数の種類ごとの記憶クラスについて解説します。

自動変数

関数内部で宣言され、宣言された関数の中でのみ使用可能な変数のことを、自動変数と言います。自動変数は、頭にauto指定子を記述します。(list_storage6-1参照)

list_storage6-1:main.c
#include <stdio.h>

void main(){
	auto int n = 100;	//	自動変数の宣言と初期化
	printf("n=%d\n", n);
}

auto指定子は、通常省略されているため、使用されることはまずないでしょう。ただ、自動変数は、メモリの中でもスタック領域と呼ばれる部分に記憶されます。この領域に記憶された変数は、関数の処理の終了と共にメモリから消去されます。

外部変数

これに対し、関数外で定義され、定義以降のどの関数からでも使用可能な変数のことを外部関数と言います。これはグローバル変数のことです。初期化はプログラム開始処理の前に一度だけ行うことができます。明示的に初期化を行わない場合は、初期値は 0 になります。記憶される領域は、静的領域(せいてきりょういき)と呼ばれるところです。

list_storage6-2:main.c
#include <stdio.h>

int g = 10;	//	外部変数の宣言

void showExterns();

void main(){
	//	値の表示
	printf("g=%d¥n", g);
	showExterns();
}

void showExterns()
{
	printf("g=%d¥n", g);
}
実行結果
g = 10
g = 10

実行結果からわかるとおり、外部変数は、どのmain()およびshowExterns()関数どちらからもアクセスすることができます。外部変数は、静的領域に記憶されているため、プログラム実行とともに生成され、プログラム終了と共に消えます。

静的変数

プログラム実行中に常に同じ場所に配置され値を保持したいときには、静的変数(せいてきへんすう)を用います。関数内部で宣言され、先頭にstatic指定子をつけます。

宣言された関数の中でのみ使用可能であるという意味では、自動変数と一緒ですが、記憶される領域が静的領域であるというのが、この変数の特徴です。プログラム開始処理の前に一度だけ初期化を行うことができます。

では、実際に、実例を見てみましょう。(list_storage6-3参照)

list_storage6-3:main.c
#include <stdio.h>

void showStatic();

void main(){
	showStatic();
	showStatic();
}

void showStatic()
{
	static int s = 100;   //  静的変数の宣言と初期化
	printf("s=%d¥n", s);
	s++;				  // 静的変数のインクリメント
}

実行結果
s=100
s=101

静的変数sは、変数showStatic()の中で定義されています。12行目で宣言・初期化されています。値が初期化処理が実行されるのは、あくまでも6行目から、最初にこの関数が呼ばれたときだけです。二回目以降は、この処理が呼ばれることはありません。

その証拠に、14行目でsの値がインクリメントされるため、再びこの関数を呼び出すと、sの値は、101になっています。これは、静的変数が一度定義されたらプログラム実行まで消えないうえに、初期化が一度しか行われないからです。

変数と記憶クラスの関係

以上から、自動変数がスタック領域、外部変数および静的変数は静的領域に記憶されていることがわかります。変数を記憶する領域としては、このほかにヒープ領域と呼ばれるものがあります。この領域に関しては、メモリの生成と消去(応用編第3日目で詳しく説明します。)