変数には寿命(正式には「記憶域期間」と呼びます)があります。変数の寿命とは、変数がどの時点で作られて、どの時点で消滅するか、変数の存在する期間を言います。
変数の寿命は、変数の宣言の仕方によって決まります。外部変数の寿命は、プログラムが実行開始から終了するまでで、その変数はプログラムの実行中に存在し続けます。このような変数の寿命を「静的記憶域期間」と呼びます。
一方、内部変数と仮引数は、その関数に制御がある期間存在します。具体的には関数が呼び出され、その関数に制御が移る直前にメモリが割り当てられ、呼び出し元に戻るときにメモリが解放されます。このような変数の寿命を「自動記憶域期間」と呼びます。C言語の変数の寿命は、静的記憶域期間と自動記憶域期間の2種類しかありません。
ではブロックスコープを持つ変数の寿命は自動記憶域期間を持つと言えるかというと、そうではありません。関数内で変数を宣言するとき、staticを付けると、その変数の寿命は静的記憶域期間となります。例えは35行目の
static char NUM[] = "0123456789abcdef";
は、_convert内で宣言されているので、NUMのスコープはブロックスコープとなります。しかしstaticが書かれているので、寿命は静的記憶域期間、すなわちNUMはプログラム実行中存在します。関数が処理を終えてもNUMはメモリに存在し続けるのです。
NUMは「charの配列」ですが初期値が書かれています。ですからNUMはプログラムの開始時にメモリに割り当てられ、開始時に1度だけ初期化されます。
さてこのNUMですが、プログラムでは数値を文字に替えるときに使います。staticを付けないで自動記憶域期間を持つ変数としてもプログラムは正しく動きますが、すると関数が呼び出され制御が移るたびに初期化が行われます。これでは効率が悪いのでstaticを付けたのです。
次回は引き続き再帰とconvert.cのアルゴリズムの解説をいたします。気になる次の問題もあわせてお届けします。
Copyright © ITmedia, Inc. All Rights Reserved.