C言語学習ポータル(無料版) 学習コンテンツ 関数とスコープ 変数の寿命とstatic

🧩 関数とスコープ

変数の寿命とstatic

無料公開版に収録・読む目安 12分

🎯 自動変数と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 は寿命だけを延ばす道具で、見える範囲は変わりません。

要点まとめ

アプリで演習問題まで解く(無料・登録不要)

この項目に出てくる用語

staticすたてぃっく

関数を抜けても値が消えずに保持され続ける変数を作る修飾子のこと。呼び出すたびに前回の値を覚えている特別なローカル変数になる。同じ関数が何回呼ばれても値を保持し続ける、カウンタなどに便利な仕組み。

スコープすこーぷ

変数や関数がプログラムのどの範囲から見えて使えるかという範囲のこと。{}の中だけで通用する変数などが具体的な例として挙げられる。同じ名前の変数でも、スコープが違えば別々の実体として扱われる。

同じトラックのほかの項目

関数とは——処理に名前を付ける関数の役割と基本の書き方が分かり、自分で作った関数を呼び出せる 引数と戻り値引数で値を受け取り、returnで結果を返す関数を書ける プロトタイプ宣言プロトタイプ宣言の役割を理解し、関数を好きな順番で書けるようになる 変数のスコープ——見える範囲ブロックごとのスコープを理解し、変数がどこから見えるか判断できる コールスタック——関数呼び出しの舞台裏関数呼び出しでスタックフレームが積まれ、戻るときに降ろされる流れを説明できる 値渡しの本質引数はコピーが渡ることを理解し、関数内の変更が呼び出し元に届かない理由を説明できる グローバル変数との付き合い方グローバル変数の性質と危険を理解し、使いどころを判断できる 関数分割の設計センス1関数1仕事の原則で、長い処理を読みやすい関数に分けられる 再帰の入口——自分を呼ぶ関数再帰の2要素(停止条件と縮小)を理解し、階乗を再帰で書ける
‹ 変数のスコープ——見える範囲 コールスタック——関数呼び出しの舞台裏 ›

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版(BOOTH)を見る

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版 / BOOTH