【C言語】記憶クラスに関するキーワードと解説

【C言語】記憶クラスに関するキーワードと解説

目次

記憶クラスとは

C言語における「記憶クラス(Storage Class)」とは、変数の寿命(ライフタイム)スコープ(可視性)を決定するための概念である。C言語には主に以下の4つの記憶クラスが存在する。

  • auto(自動変数)
  • static(静的変数)
  • extern(外部変数)
  • register(レジスタ変数)

それぞれの記憶クラスは、変数がどこで定義されるか、どのくらいの期間メモリに保持されるか、どの範囲で参照できるかを決定する。

auto

autoは「自動変数(Automatic Variable)」を表し、ブロック内で宣言されたローカル変数のデフォルトの記憶クラスである。

特徴

  • 関数やブロック内で宣言された変数に適用される。
  • スコープは宣言されたブロック内に限定される(ローカルスコープ)。
  • 関数の呼び出しが終了すると自動的に破棄される。


#include <stdio.h>

void func() {
    auto int a = 10; // "auto" を明示的に指定(通常は省略)
    printf("%d\n", a);
}

int main() {
    func();
    return 0;
}

上記のコードでは、aは関数func()の実行中にのみ存在し、関数が終了すると破棄される。

static

staticは「静的変数」を定義するために使われる記憶クラスである。

特徴

  • 変数の寿命はプログラムの実行が終わるまで維持される(静的記憶領域に割り当てられる)。
  • ローカル変数として使用すると、ブロックの外では見えないが、値は関数呼び出しの間で保持される。
  • グローバル変数として使用すると、ファイルスコープを持ち、他のファイルからアクセスできなくなる(内部リンケージ)。

ローカル変数での使用例


#include <stdio.h>

void counter() {
    static int count = 0; // 初回のみ初期化
    count++;
    printf("Count: %d\n", count);
}

int main() {
    counter(); // Count: 1
    counter(); // Count: 2
    counter(); // Count: 3
    return 0;
}

この例では、countは関数呼び出しのたびに値が保持される。

グローバル変数での使用例


// file1.c
#include <stdio.h>

static int globalVar = 10; // 他のファイルから参照不可

void printVar() {
    printf("%d\n", globalVar);
}

staticを指定すると、他のソースファイルからこの変数にアクセスできなくなる。

extern

externは「外部変数」を指し、他のファイルや関数で定義された変数を参照するために使用される。

特徴

  • グローバル変数の宣言に使用される。
  • 変数の実体は別のファイルに存在し、externを使うことで参照できる。


// file1.c
#include <stdio.h>

int globalVar = 100; // ここで変数を定義

void printVar() {
    printf("%d\n", globalVar);
}

// file2.c
#include <stdio.h>

extern int globalVar; // 他のファイルの変数を参照

int main() {
    printf("GlobalVar: %d\n", globalVar);
    return 0;
}

このように、externを使うことで他のファイルで定義された変数を利用できる。

register

registerは「レジスタ変数」を指定する記憶クラスである。

特徴

  • CPUのレジスタを使用することをコンパイラに指示する(必ずしもレジスタに格納されるとは限らない)。
  • メモリアクセスより高速に処理できる可能性がある。
  • ポインタでアドレスを取得することはできない。


#include <stdio.h>

void func() {
    register int i;
    for (i = 0; i < 10; i++) {
        printf("%d ", i);
    }
}

int main() {
    func();
    return 0;
}

コンパイラが適切と判断すれば、変数iはCPUのレジスタに配置され、高速な処理が可能になる。

まとめ

記憶クラス スコープ 寿命 特徴
auto ブロック内 ブロック終了まで デフォルトのローカル変数
static ローカル or ファイル プログラム終了まで 値を保持、外部アクセス制限可
extern グローバル プログラム終了まで 他ファイルの変数を参照
register ブロック内 ブロック終了まで 高速アクセス
コメントは受け付けていません。