スコープ: 変数の寿命

変数は「どこでも使える」わけではない。グローバル変数の危険性とstatic変数。

スコープ
変数が有効な範囲(場所)。
ライフタイム
変数がメモリ上に存在している期間(時間)。
static修飾子
ローカル変数の寿命をプログラム終了まで延ばす。
ホテルのカードキー (Hotel Key)

変数のスコープは「ホテルのアクセス権」です。 ・ローカル変数 = 客室のカードキー。その部屋(関数)にいる間だけ有効です。チェックアウト(関数終了)すると無効になります。 ・グローバル変数 = 公園のベンチ。誰でも座れますし、誰かがそこにガムを捨てれば、次に座る人が被害を受けます(副作用)。 ・static変数 = 貸金庫。部屋を出ても中身は保管されますが、鍵を持っているのはあなた(その関数)だけです。

変数の生存期間

変数は宣言された場所によって、生きられる期間が決まります。

  • ローカル変数(関数内): 関数が呼ばれた時に生まれ、終わると死にます(メモリから消えます)。
  • グローバル変数(関数外): プログラム開始時に生まれ、終了するまで生き続けます。

グローバル変数の禁止

初心者は「どこからでもアクセスできて便利だから」とグローバル変数を使いがちですが、これは 実務では厳禁 です。誰がいつ値を書き換えたか追跡不能になり、バグの原因特定が困難になるからです。

ローカル vs グローバル

Lifetime Comparison
// グローバル変数(どこからでもアクセス可)
int global_count = 0; // 危険!
void increment() {
int local_count = 0; // ローカル変数
local_count++;
global_count++;
printf("Local: %d, Global: %d\n", local_count, global_count);
}
int main(void) {
increment(); // Local: 1, Global: 1
increment(); // Local: 1, Global: 2
// local_count は毎回リセットされるが、
// global_count は値を覚えている(副作用の温床)
return 0;
}

実践テクニック

static ローカル変数

「値を覚えておきたいけど、グローバル変数みたいに誰彼構わず触らせたくない」という場合は、関数内に <code>static</code> 変数を作ります。これは「自分専用の秘密のメモ帳」のようなものです。

Static Usage
// static ローカル変数(推奨される代替案)
void increment_safe() {
// 関数内だけで有効だが、値を覚え続ける
static int count = 0;
count++;
printf("Count: %d\n", count);
}
int main(void) {
increment_safe(); // Count: 1
increment_safe(); // Count: 2
return 0;
}

演習課題

課題1: カウンター
呼び出すたびに 1, 2, 3... と増えていく値を返す関数 counter() を、グローバル変数を使わずに(staticを使って)実装してください。

合格ライン

関数が終わるとローカル変数が消えることを知っている
グローバル変数がなぜ危険か説明できる
static 変数を使える