はじめに
C言語では、
int x;のように変数を宣言できます。
しかし実は、変数には「いつ生成され、いつ消えるのか」
という概念があります。
これを、記憶域期間(Storage Duration)と呼びます。
ここが初心者の超混乱ポイント
初心者のうちは、
- スコープ
- メモリ領域
- 記憶域期間
をごちゃ混ぜにしがちです。
例えば:
static int x;を見ると、
初心者さんローカル変数なのに消えない?
となる人が非常に多いです。



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



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



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



そこが重要なんだ。
“見える範囲” と “存在する期間” は別なんだよ
C言語文法解説シリーズ
本記事は「C言語文法解説シリーズ」の1つです。
C言語の文法を、組み込み開発の視点も交えて解説しています。
C言語文法解説シリーズ一覧はこちら


C言語の文法を基礎から体系的に解説するシリーズです。
- ローカル変数とは?
- グローバル変数とは?
- static変数とは?
- 記憶域期間とは? ← 今回
- スコープとは?
記憶域期間とは?
記憶域期間とは、「変数が存在している期間」です。
つまり、いつ生成され、いつ破棄されるかを表します。
スコープとの違い
スコープ
→ どこから見えるか
記憶域期間
→ いつまで存在するか
です。
スコープについてはこちらの記事で解説しています。


例えばローカル変数
void func(void) {
int x = 10;
}この x は:
| 項目 | 内容 |
|---|---|
| スコープ | func内 |
| 記憶域期間 | 関数実行中のみ |
です。
関数終了で消える
通常のローカル変数は、
関数開始
↓
変数生成
↓
使用
↓
関数終了
↓
変数破棄
という流れになります。



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



そう。関数呼び出しごとに新しく作られるからね
ローカル変数についてはこちらの記事で解説しています。


static変数はどうなる?
次は static を付けます。
void func(void) {
static int x = 0;
}この x は:
| 項目 | 内容 |
|---|---|
| スコープ | func内 |
| 記憶域期間 | プログラム終了まで |
になります。
ローカルなのに消えない
ここがstaticの本質です。
見える範囲はローカル
でも寿命は長い
という特殊な変数です。
static変数の流れ
プログラム開始時に生成
↓
値保持
↓
関数呼び出しごとに再利用
↓
プログラム終了で破棄
になります。
static変数についてはこちらの記事で解説しています。


グローバル変数の記憶域期間
例えば:
int g_value;これはグローバル変数です。
グローバル変数は:
| 項目 | 内容 |
|---|---|
| スコープ | 複数関数 |
| 記憶域期間 | プログラム終了まで |
になります。
つまりstaticと寿命は同じ
初心者は、「static変数だけ特別」と思いがちですが、
実は:
- static変数
- グローバル変数
は、どちらも長い記憶域期間を持ちます。
グローバル変数についてはこちらの記事で解説しています。


記憶域期間の種類
C言語では主に以下があります。
| 種類 | 例 | 生存期間 |
|---|---|---|
| 自動記憶域期間 | ローカル変数 | 関数実行中 |
| 静的記憶域期間 | static変数、グローバル変数 | プログラム全体 |
自動記憶域期間(automatic storage duration)
通常のローカル変数です。
int x;関数呼び出し時に生成され、
関数終了で破棄されます。
静的記憶域期間(static storage duration)
例えば:
static int x;や:
int g_value;です。
プログラム開始から終了まで存在します。
メモリ領域との関係
通常:
| 種類 | 主な配置先 |
|---|---|
| 自動記憶域期間 | スタック |
| 静的記憶域期間 | .data / .bss |
になります。



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



そう。
関数のたびに作り直されないからね
スタック領域についてはこちらの記事にて解説しています。


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


なぜ重要なの?
記憶域期間を理解すると、
- staticの意味
- なぜ値が残るか
- なぜ危険な場合があるか
- スタックとの違い
が全部つながります。
特に組み込み開発では非常に重要です。
組み込みで重要な理由
例えば:
- RAM使用量
- スタックサイズ
- static領域
- 割り込み共有
- 再入性
などに直結するからです。
よくある誤解
「ローカル変数 = スタック」
これは初心者向けには概ね正しいですが、
厳密には:
通常の自動記憶域期間を持つ
ローカル変数が主にスタック
です。
staticローカル変数は:
ローカル変数だが
静的記憶域期間
を持ちます。
まとめ
記憶域期間とは、「変数が存在している期間」です。
重要なのは、
- スコープ
- 記憶域期間
を分けて考えることです。
| 項目 | 意味 |
|---|---|
| スコープ | どこから見えるか |
| 記憶域期間 | いつまで存在するか |
この違いを理解すると、C言語のstaticやメモリ構造の理解が一気に深まります。
この記事が参考になった方へ
スコープを含むC言語の基本文法をこちらの記事で整理しています。


エンジニアとして技術を学ぶことは重要ですが、
キャリアや副業についても同時に考える必要があります。
副業の現実や市場価値、今後のキャリア戦略については、
こちらの記事でまとめています。


技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。
小さなご相談からでもお気軽にご連絡ください。





コメント