Tips

C言語 変数のスコープ【基礎 第19回】

記憶クラス

変数には先ほど述べたようにローカル変数とグローバル変数というものがありました。
これらの変数をどこに記憶するのかを指定することができ、これを指定するものとして記憶クラスの
指定子あります。
記憶クラスの指定子として「static」「auto」「extern」というものがあります。
この記憶クラス指定子を使用して変数を宣言するには以下のように行います。

記憶指定子 データ型 変数名

記憶クラスの指定子を一つずつ見ていきましょう。

auto指定子

auto記憶クラス指定子は、宣言した際にメモリ上に領域が確保されます。
そしてメモリ上からその領域が解放されるのは関数の処理が終了したときとなります。
そのため関数が何度も呼び出されてもその都度、メモリが確保され解放される形となります。プログラム終了まで
無駄にメモリを確保し続けるということはありません。実際に確保される領域はスタックといわれる領域です。
auto指定子はこのように関数内が存在する間ということになるのでローカル変数で使用されるものとなり
グローバル変数につけるものではありません。
この記憶クラス指定子ですが、関数内で何も指定子をつけずに変数を宣言すると自動的につけられます。
今までのサンプルコードで使用していたローカル変数はauto指定子のついた変数ということになります。

static指定子

この指定子をつけて変数を宣言した場合はその関数の処理が終了しても変数の領域がメモリ上から解放されません。
メモリ上に確保されるのはプログラムが実行された時点で、メモリ上から解放されるのはプログラムの終了時となります。
関数に入るたびに確保され、関数が終了すると解放されるauto指定子のついた変数とは挙動がことなるので
使用の際は気を付けておく必要があります。
このように関数内で宣言されているにも関わらずの関数の開始終了に連動せず変数の値を保持し続けるため、
static指定子を使用している関数を様々なところから呼び出した場合、呼び出すタイミングで値が変更している
可能性があります。そういったことも考慮する必要があります。

この指定子はローカル変数だけでなくグローバル変数にも使用できます。
グローバル変数でstaticを使用した場合は、その変数が宣言されているファイル内でのみ有効となります。
ファイル内の関数であれば、問題なく使用できますがその他のファイルからは使用できません。
付けていないグローバル変数は他のファイル内の関数から使用できます・
このような特徴を持つことから、1つのファイルしか使用していない環境では特に違いがありません。

static指定子を使用した場合、保存される領域はスタックではなくメモリの静的領域という部分になります。
ここには以前出てきたグローバル変数も格納されます。
では次のコードで確認してみましょう。

#include <stdio.h>
void func(void){
	static int i = 0;
	printf("iの値は%dですn", i);
	i++;
}
int main(void){
	printf("1回目呼び出しn");
	func();
	printf(“2回目呼び出しn");
	func();
	return(0);
}

実行結果は以下のようになります。

1回目呼び出し
iの値は0です
2回目呼び出し
iの値は1です

staticを外した場合は、以下のようになります。

1回目呼び出し
iの値は0です
2回目呼び出し
iの値は0です

staticを使用した場合は、func関数のiの値が関数を終了しても保持されるため初期値は0となりますが、
3行目のインクリメントで1となります。関数を終了してもそのまま1が保持されるため呼び出しごとに値が変わります。
staticを使用しない場合は、関数終了後に破棄され、2回目の呼び出し時は再び0から始まるため
値を表示させても変化ありません。

extern指定子

この指定子は複数のソースコードをまたがった場合に意味があります。
複数のファイルから構成されるプログラムの場合、どこかのプログラムで定義されたグローバル変数を使用したい
場合があります。
そういったときに宣言だけを行うために使用するのがこのextern指定子となります。
この指定子に関してはもう少し後の回で説明します。

このように変数にはスコープがあり、それにより有効範囲が変わります。
また記憶子を指定することでどの段階で中身が解放されるのかが変わるため扱う時には注意する必要があります。

実践力が身につくC言語講座 連載リンク

競技プログラミングをイメージしたライブラリ活用講座
競技プログラミング風-標準Cライブラリ入門 連載

アルゴリズムをマスターして技術力アップ!
実践アルゴリズム講座 連載

パズルゲームの解析をテーマにしたC++講座
ゲーム解析プログラミング 連載

Recent News

Recent Tips

Tag Search