スコープ: 変数の寿命
変数は「どこでも使える」わけではない。グローバル変数の危険性とstatic変数。
スコープ
変数が有効な範囲(場所)。
ライフタイム
変数がメモリ上に存在している期間(時間)。
static修飾子
ローカル変数の寿命をプログラム終了まで延ばす。
変数の生存期間
変数は宣言された場所によって、生きられる期間が決まります。
- ローカル変数(関数内): 関数が呼ばれた時に生まれ、終わると死にます(メモリから消えます)。
- グローバル変数(関数外): プログラム開始時に生まれ、終了するまで生き続けます。
グローバル変数の禁止
初心者は「どこからでもアクセスできて便利だから」とグローバル変数を使いがちですが、これは 実務では厳禁 です。誰がいつ値を書き換えたか追跡不能になり、バグの原因特定が困難になるからです。
ローカル vs グローバル
// グローバル変数(どこからでもアクセス可)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 ローカル変数(推奨される代替案)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 変数を使える