メモリ領域: スタックとヒープ

「作業机」と「巨大倉庫」。この2つの違いを知ることが安定稼働への道。

スタック (Stack)
関数内の変数が置かれる領域。高速だが狭い。自動で掃除される。
ヒープ (Heap)
巨大なデータを置くための自由領域。広大だが手動管理が必要。
作業机と巨大倉庫 (Workbench vs Warehouse)

メモリには2つの場所があります。 1つは「スタック(作業机)」です。手の届く範囲にあり、非常に高速ですが、狭いです。作業が終われば(関数が終了すれば)自動で片付けられます。 もう1つは「ヒープ(巨大倉庫)」です。広大ですが、遠くにあります。使うには申請(malloc)が必要で、使い終わったら自分で返却(free)しないと、ゴミが溜まり続けます。

2つの作業場所

プログラムがメモリを使うとき、主に2つの場所を使います。

  • スタック (机): 手の届く範囲。ローカル変数はここに置かれます。関数が終わると自動的に片付けられます。非常に高速ですが、置ける量には限りがあります(数MB程度)。
  • ヒープ (倉庫): 広大なスペース。画像データやデータベースなど、大きなものはここに置きます。ただし、自分で取りに行き(malloc)、使い終わったら自分で返す(free)必要があります。

違いをコードで見る

Stack

Stack Usage
// スタック変数
void func() {
int a = 10; // スタックに置かれる
int arr[100]; // これもスタック
// 関数が終わると自動で消える
}
// ❌ スタックオーバーフロー
void crash() {
int big[1000000]; // 巨大すぎる!(数MBしかない)
// 実行時にクラッシュ
}

Heap

Heap Usage
// ヒープ変数
void func() {
// 倉庫から借りてくる (malloc)
int *big = (int*)malloc(sizeof(int) * 1000000);
// ...使う...
// 自分で返す (free)
free(big);
}

実践テクニック

基本はスタック

メモリ管理は面倒です。サイズが決まっていて、それほど大きくない(数KB以内)なら、スタック変数を使うのが一番安全で高速です。「どうしても必要なときだけヒープ」にするのが賢い戦略です。

演習課題

課題1: 限界を知る
再帰関数を無限に呼び出すプログラム(ベースケースなし)を書き、実行してクラッシュ(Stack Overflow)させてみてください。これが「机がいっぱいになった」状態です。

合格ライン

スタック変数が自動で消えることを知っている
巨大な配列をスタックに置くと危険な理由を説明できる