連載
» 2014年12月26日 11時00分 公開

完全マスター! 組み込みC言語プログラミング(16):【問題15】変数を制する者は関数を制する (3/3)

[横田一弘 埼玉県立新座総合技術高等学校 教諭,MONOist]
前のページへ 1|2|3       

変数の寿命

 変数には寿命(正式には「記憶域期間」と呼びます)があります。変数の寿命とは、変数がどの時点で作られて、どの時点で消滅するか、変数の存在する期間を言います。

 変数の寿命は、変数の宣言の仕方によって決まります。外部変数の寿命は、プログラムが実行開始から終了するまでで、その変数はプログラムの実行中に存在し続けます。このような変数の寿命を「静的記憶域期間」と呼びます。

 一方、内部変数と仮引数は、その関数に制御がある期間存在します。具体的には関数が呼び出され、その関数に制御が移る直前にメモリが割り当てられ、呼び出し元に戻るときにメモリが解放されます。このような変数の寿命を「自動記憶域期間」と呼びます。C言語の変数の寿命は、静的記憶域期間と自動記憶域期間の2種類しかありません。

 ではブロックスコープを持つ変数の寿命は自動記憶域期間を持つと言えるかというと、そうではありません。関数内で変数を宣言するとき、staticを付けると、その変数の寿命は静的記憶域期間となります。例えは35行目の

static char NUM[] = "0123456789abcdef";

 は、_convert内で宣言されているので、NUMのスコープはブロックスコープとなります。しかしstaticが書かれているので、寿命は静的記憶域期間、すなわちNUMはプログラム実行中存在します。関数が処理を終えてもNUMはメモリに存在し続けるのです。

 NUMは「charの配列」ですが初期値が書かれています。ですからNUMはプログラムの開始時にメモリに割り当てられ、開始時に1度だけ初期化されます。

 さてこのNUMですが、プログラムでは数値を文字に替えるときに使います。staticを付けないで自動記憶域期間を持つ変数としてもプログラムは正しく動きますが、すると関数が呼び出され制御が移るたびに初期化が行われます。これでは効率が悪いのでstaticを付けたのです。

 次回は引き続き再帰とconvert.cのアルゴリズムの解説をいたします。気になる次の問題もあわせてお届けします。

お知らせ

photo 「CADLUS+Arduino電子工作ガイド」

本連載「完全マスター! 組み込みC言語プログラミング」も好評掲載中の横田氏による書籍「CADLUS+Arduino電子工作ガイド」(オーム社)が発売中です。

Arduinoと無料プリント基板CAD「CADLUS PCB」を組み合わせた電子工作の手法を示すもので、実際にサンプルを示しながら、プリント基板の設計、作成から組み立て、プログラムまでを手順を追って解説しています。



前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.