🧩 関数とスコープ
🎯 自動変数とstatic変数の寿命の違いを説明でき、使い分けられる
前のトピックが「どこから見えるか」の話なら、今回は「いつまで生きているか」の話です。この2つは似ていますが別物で、混ぜて考えると必ずつまずきます。
ふつうの局所変数は自動変数と呼ばれ、宣言された瞬間に生まれ、ブロックを抜けると消えます。関数を呼ぶたびに新品が用意されるので、前回の値は残っていません。使い捨てのメモ用紙のようなものです。
ところが、関数の中に置いたまま値を残したいことがあります。そこで使うのが static です。
#include <stdio.h>
int counter(void)
{
static int count = 0; // 最初の1回だけ初期化される
count++;
return count;
}
int main(void)
{
printf("%d\n", counter()); // 1
printf("%d\n", counter()); // 2
printf("%d\n", counter()); // 3
return 0;
}static int count = 0; の初期化はプログラム開始時に一度だけ行われ、関数を抜けても count は消えません。次に呼ばれたとき、前回の値の続きから始まります。ノートを引き出しにしまっておくイメージです。
大事なのは、static を付けてもスコープは広がらないことです。count は相変わらず counter の中からしか見えません。変わるのは寿命だけ。「見える範囲は狭いまま、寿命だけ長い」——これが static 局所変数の正体です。
初期化のルールの違い
void f(void)
{
int a; // 中身は不定(ゴミ)。使う前に必ず代入する
static int b; // 自動的に 0 で初期化される
printf("%d\n", b);
}自動変数は初期化を書かなければ中身が不定ですが、static 変数は必ず 0 から始まります。この差は覚えておくと事故を防げます。
どこに置かれているのか
自動変数は関数を呼ぶたびにスタック上の作業台に作られ、抜けるときに丸ごと片づけられます。一方 static 変数は、プログラム開始時に別の場所(静的領域)へ一度だけ確保されます。置き場所が違うから寿命も違う、というわけです。メモリのどこに何が置かれるかは、第2部で地図にして詳しく見ます。
使いどころの例
いずれも「その関数だけが知っていればよい情報」です。同じことをグローバル変数でやると誰からでも触れてしまうので、static 局所変数のほうが安全です。
罠・注意
static は「回数を数える」「前回値を覚える」など、必要な場面に絞りましょう。static int count = 0; を「毎回0に戻る」と誤解しがちですが、初期化は最初の1回だけです。static を付けた変数は、同じ関数を何度呼んでも共有されます。あとで複数の処理を同時に動かすようになると、この共有が思わぬ不具合の種になります。まとめ: 自動変数は使い捨て、static 変数は据え置き。static は寿命だけを延ばす道具で、見える範囲は変わりません。
関数を抜けても値が消えずに保持され続ける変数を作る修飾子のこと。呼び出すたびに前回の値を覚えている特別なローカル変数になる。同じ関数が何回呼ばれても値を保持し続ける、カウンタなどに便利な仕組み。
変数や関数がプログラムのどの範囲から見えて使えるかという範囲のこと。{}の中だけで通用する変数などが具体的な例として挙げられる。同じ名前の変数でも、スコープが違えば別々の実体として扱われる。
もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。