C言語の変数の寿命(ライフタイム)とは?記憶クラス4種類を徹底解説
記憶クラス(Storage Class)とは
C言語における記憶クラスは、変数の「スコープ(有効範囲)」「寿命(ライフタイム)」「リンケージ(結合)」を決定する重要な概念です。
変数を完全に定義するには、データ型だけでなく記憶クラスも指定する必要があります。変数名はコンピュータのメモリ上の物理的な位置を識別するものであり、その位置には変数の値を格納するためのビット列が割り当てられています。
記憶クラスを指定することで、以下の要素が決まります。
- 変数がどこに格納されるか(メモリか、CPUのレジスタか)
- 初期化しなかった場合のデフォルトの初期値は何か
- 変数のスコープはどこまでか(どこからアクセスできるか)
- 変数の寿命はどのくらいか
変数の寿命(Lifetime)の種類
変数の寿命とは、コンピュータがその変数に対してメモリを割り当てている期間、すなわちメモリの割り当てから解放までの期間を指します。
C言語では、変数の寿命は「自動」「静的」「動的」の3種類に分類されます。
自動(Automatic)
宣言が実行されるたびに変数が生成され、ブロックを抜けると破棄されます。通常のローカル変数がこれに該当します。
静的(Static)
宣言が最初に実行されたときに変数が生成され、プログラムの実行が終了するまで破棄されません。関数呼び出しの間も値が保持されます。
動的(Dynamic)
malloc()やfree()などのメモリ管理関数によって、メモリの割り当てと解放がプログラマの制御で行われます。
C言語の4つの記憶クラス一覧
C言語には以下の4つの記憶クラスが存在します。
| 記憶クラス | 格納領域 | デフォルト初期値 | 寿命 | スコープ | キーワード |
|---|---|---|---|---|---|
| 自動(Automatic) | メモリ | 不定値(ガベージ値) | ブロック内に制御がある間 | ローカル | auto |
| レジスタ(Register) | CPUレジスタ | 不定値(ガベージ値) | ブロック内に制御がある間 | ローカル | register |
| 静的(Static) | メモリ | ゼロ | 関数呼び出し間も値が保持される | ローカル | static |
| 外部(External) | メモリ | 不定値(ガベージ値) | プログラム実行中ずっと | グローバル | extern |
サンプルプログラム1:自動記憶クラス(auto)
以下は、自動記憶クラスの動作を確認するC言語のプログラムです。ブロックごとに同じ名前の変数iが宣言されていますが、それぞれ独立した変数として扱われます。
#include<stdio.h>
main ( ){
auto int i=1;{
auto int i=2;{
auto int i=3;
printf ("%d",i);
}
printf("%d", i);
}
printf("%d", i);
}
実行結果
上記のプログラムを実行すると、以下の出力が得られます。
3 2 1
最も内側のブロックで宣言されたi=3が最初に出力され、ブロックを抜けるごとに外側の変数が参照されるため、3・2・1の順に表示されます。
サンプルプログラム2:外部記憶クラス(extern)
以下は、外部記憶クラスの動作を確認するC言語のプログラムです。externで宣言された変数はプログラム全体からアクセス可能です。
#include<stdio.h>
extern int i =1; /* このiはプログラム全体から参照可能 */
main ( ){
int i = 3; /* このiはmain関数内でのみ有効 */
printf ("%d", i);
fun ( );
}
fun ( ) {
printf ("%d", i);
}
実行結果
上記のプログラムを実行すると、以下の出力が得られます。
3 1
main関数内ではローカル変数i=3が優先されるため3が出力され、fun関数内ではexternで宣言されたグローバル変数i=1が参照されるため1が出力されます。
まとめ
記憶クラスを正しく理解することで、変数のスコープや寿命を意図通りに制御できます。特にstaticは関数呼び出し間で値を保持したい場合に、externは複数のファイル間で変数を共有したい場合に活用される重要なキーワードです。用途に応じて適切な記憶クラスを選択しましょう。
-
C言語のネストされたif-else文をわかりやすく解説!構文と実例付き
ネストされたif-else文とは?「ネストされたif(入れ子のif)」とは、if文またはelse文の中に、さらに別のif文が含まれている構造のことを指します。つまり、ある条件分岐の処理ブロック内に、別の条件判断を組み込むことで、より複雑な条件判定を実現できるのです。この仕組みを使うことで、「複数の条件が同時に成り立つかどうか」「段階的な条件チェック」などを、柔軟にプログラムへ組み込むことが可能になります。基本構文ネストされたif-else文の基本的な書き方は以下の通りです。if (condition1){ if (condition2) stmt1; else
-
C言語の単純if文(simple if)をわかりやすく解説
はじめにC言語における「if」キーワードは、論理条件が真(true)と評価された場合にのみ、特定の一連のステートメントを実行するために使用される、最も基本的な条件分岐です。本記事では、単純if文(simple if)の構文、動作の仕組み、そして具体的なサンプルコードを通じてその基本を解説します。構文単純if文の構文は以下の通りです。if (condition) { Statement(s); }単純if文の動作ifブロック内のステートメントは、条件が真(true)の場合にのみ実行され、偽(false)の場合は一切実行されません。条件が真のときに実行したいステートメントが1つだけである場