C言語の記憶域期間とは?変数の寿命をローカル・static・グローバルで理解しよう

目次

はじめに

C言語では、

C
int x;

のように変数を宣言できます。

しかし実は、変数には「いつ生成され、いつ消えるのか」
という概念があります。

これを、記憶域期間(Storage Duration)と呼びます。


ここが初心者の超混乱ポイント

初心者のうちは、

  • スコープ
  • メモリ領域
  • 記憶域期間

をごちゃ混ぜにしがちです。

例えば:

C
static int x;

を見ると、

初心者さん

ローカル変数なのに消えない?

となる人が非常に多いです。


初心者さん

ローカル変数って、関数が終わると消えるんですよね?

エンジニアくん

通常のローカル変数はそうだね。でもstaticを付けると変わるんだ

初心者さん

えっ、でもローカル変数ですよね?

エンジニアくん

そこが重要なんだ。
“見える範囲” と “存在する期間” は別なんだよ


C言語文法解説シリーズ

本記事は「C言語文法解説シリーズ」の1つです。
C言語の文法を、組み込み開発の視点も交えて解説しています。

C言語文法解説シリーズ一覧はこちら

C言語の文法を基礎から体系的に解説するシリーズです。


記憶域期間とは?

記憶域期間とは、「変数が存在している期間」です。

つまり、いつ生成され、いつ破棄されるかを表します。


スコープとの違い

スコープ

→ どこから見えるか

記憶域期間

→ いつまで存在するか

です。

スコープについてはこちらの記事で解説しています。


例えばローカル変数

C
void func(void) {
    int x = 10;
}

この x は:

項目内容
スコープfunc内
記憶域期間関数実行中のみ

です。


関数終了で消える

通常のローカル変数は、

関数開始

変数生成

使用

関数終了

変数破棄

という流れになります。


初心者さん

だから毎回初期化されるんですね!

エンジニアくん

そう。関数呼び出しごとに新しく作られるからね


ローカル変数についてはこちらの記事で解説しています。

static変数はどうなる?

次は static を付けます。

C
void func(void) {
    static int x = 0;
}

この x は:

項目内容
スコープfunc内
記憶域期間プログラム終了まで

になります。


ローカルなのに消えない

ここがstaticの本質です。

見える範囲はローカル
でも寿命は長い

という特殊な変数です。


static変数の流れ

プログラム開始時に生成

値保持

関数呼び出しごとに再利用

プログラム終了で破棄

になります。


static変数についてはこちらの記事で解説しています。

グローバル変数の記憶域期間

例えば:

C
int g_value;

これはグローバル変数です。

グローバル変数は:

項目内容
スコープ複数関数
記憶域期間プログラム終了まで

になります。


つまりstaticと寿命は同じ

初心者は、「static変数だけ特別」と思いがちですが、

実は:

  • static変数
  • グローバル変数

は、どちらも長い記憶域期間を持ちます。


グローバル変数についてはこちらの記事で解説しています。

記憶域期間の種類

C言語では主に以下があります。

種類生存期間
自動記憶域期間ローカル変数関数実行中
静的記憶域期間static変数、グローバル変数プログラム全体

自動記憶域期間(automatic storage duration)

通常のローカル変数です。

C
int x;

関数呼び出し時に生成され、

関数終了で破棄されます。


静的記憶域期間(static storage duration)

例えば:

C
static int x;

や:

C
int g_value;

です。

プログラム開始から終了まで存在します。


メモリ領域との関係

通常:

種類主な配置先
自動記憶域期間スタック
静的記憶域期間.data / .bss

になります。


初心者さん

だからstatic変数は値が残るんですね!

エンジニアくん

そう。
関数のたびに作り直されないからね


スタック領域についてはこちらの記事にて解説しています。

.data/.bss領域についてはこちらの記事にて解説しています。

なぜ重要なの?

記憶域期間を理解すると、

  • staticの意味
  • なぜ値が残るか
  • なぜ危険な場合があるか
  • スタックとの違い

が全部つながります。

特に組み込み開発では非常に重要です。


組み込みで重要な理由

例えば:

  • RAM使用量
  • スタックサイズ
  • static領域
  • 割り込み共有
  • 再入性

などに直結するからです。


よくある誤解

「ローカル変数 = スタック」

これは初心者向けには概ね正しいですが、

厳密には:

通常の自動記憶域期間を持つ
ローカル変数が主にスタック

です。

staticローカル変数は:

ローカル変数だが
静的記憶域期間

を持ちます。


まとめ

記憶域期間とは、「変数が存在している期間」です。

重要なのは、

  • スコープ
  • 記憶域期間

を分けて考えることです。

項目意味
スコープどこから見えるか
記憶域期間いつまで存在するか

この違いを理解すると、C言語のstaticやメモリ構造の理解が一気に深まります。

この記事が参考になった方へ

スコープを含むC言語の基本文法をこちらの記事で整理しています。

エンジニアとして技術を学ぶことは重要ですが、
キャリアや副業についても同時に考える必要があります。

副業の現実や市場価値、今後のキャリア戦略については、
こちらの記事でまとめています。

技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。

小さなご相談からでもお気軽にご連絡ください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

組み込みソフトエンジニアとして働きながら、
C言語・メモリ・ポインタなどの基礎から実務まで解説しています。

副業・キャリアについても実体験ベースで発信中です。

X・Qiita・noteでも発信しています。
X:更新情報・日常
Qiita:技術発信
note:キャリア・副業

▼まずはここから読むのがおすすめ
C言語文法シリーズ
メモリ領域解説シリーズ
割り込み処理解説シリーズ
ソフトウェア設計解説シリーズ
キャリアと副業ロードマップ

コメント

コメントする


目次