【6日でできるC言語入門】記憶クラス

 C言語の「記憶クラス(ストレージクラス)」は、変数がどの記憶領域に格納されるかや、変数の有効範囲・生存期間を決定する大切な仕組みです。
普段何気なく使っているローカル変数やグローバル変数も、実は記憶クラスによって性質が大きく異なります。
 ここでは、代表的な3つの記憶クラス(自動変数・外部変数・静的変数)を中心に、表や具体例、図を使いながら分かりやすく解説します。

1.記憶クラスの概要

1.1. 記憶クラスとは

 C言語の変数は、「どこに格納されるか」「どこから参照できるか」「いつ値が消えるか」という性質(記憶クラス)によって分類されます。
主な記憶クラスは以下の3種類です。

記憶クラス主な指定子記憶領域有効範囲初期値
自動変数auto(省略可)スタック領域関数内不定値
外部変数(なし)静的領域プログラム全体0
静的変数static静的領域宣言した関数内等0

1.2. 記憶クラスのイメージ

2.各記憶クラスの特徴と使い方

2.1. 自動変数(ローカル変数)

  • 関数内部で宣言される変数
  • 通常「auto」指定子は省略される。
  • 関数の呼び出し時に生成、終了時に消滅
  • スタック領域に格納される。

プロジェクト/ファイル名: Lesson63_1/main.c

#include <stdio.h>

int main(void) {
    auto int x = 50; // 「auto」は通常省略される
    printf("自動変数xの値は%dです。\n", x);
    return 0;
}

実行結果

自動変数xの値は50です。

解説

  • 「auto」を付けても付けなくても同じ意味
  • 通常のローカル変数=自動変数

2.2. 外部変数(グローバル変数)

  • 関数の外側で宣言する変数
  • プログラム全体からアクセス可能
  • 静的領域に格納
  • 初期化しない場合は自動的に「0」で初期化される。

プロジェクト/ファイル名: Lesson63_2/main.c

#include <stdio.h>

int global_count = 5; // 外部変数

void print_count() {
    printf("外部変数global_countの値は%dです。\n", global_count);
}

int main(void) {
    printf("main関数: global_count=%d\n", global_count);
    print_count();
    return 0;
}

実行結果

main関数: global_count=5
外部変数global_countの値は5です。

解説

  • 関数間で値を共有したい場合に便利
  • 初期値を省略すると「0」になる。

2.3. 静的変数(static変数)

  • 「static」指定子で宣言
  • ローカル変数として宣言しても、関数の呼び出しごとに値が保存される。
  • 静的領域に格納

プロジェクト/ファイル名: Lesson63_3/main.c

#include <stdio.h>

void count_up() {
    static int counter = 1; // 静的変数
    printf("counterの値は%dです。\n", counter);
    counter++;
}

int main(void) {
    count_up();
    count_up();
    return 0;
}

実行結果

counterの値は1です。
counterの値は2です。

解説

  • 静的変数は関数を抜けても値が保持される
  • 初期化はプログラム起動時に1度だけ

3.その他の記憶クラス

3.1. register指定子

  • CPUレジスタを使って高速化を試みる指定子
  • 実際は最適化の程度は処理系依存

register int r = 10;

3.2. extern指定子

  • 外部ファイルの変数を参照する場合に使う

extern int global_count;

まとめ

  • 記憶クラスは「変数がどこに格納され、どの範囲で使えるか」を決定する重要な仕組み。
  • 主なクラスは「自動変数」「外部変数」「静的変数」
  • それぞれの違いを理解して使い分けることで、より安全で効率的なプログラミングが可能

C言語の記憶クラスをマスターして、メモリの使い方をもっと賢く、自在にコントロールしましょう。