メモリ領域: スタックとヒープ
「作業机」と「巨大倉庫」。この2つの違いを知ることが安定稼働への道。
スタック (Stack)
関数内の変数が置かれる領域。高速だが狭い。自動で掃除される。
ヒープ (Heap)
巨大なデータを置くための自由領域。広大だが手動管理が必要。
2つの作業場所
プログラムがメモリを使うとき、主に2つの場所を使います。
- スタック (机): 手の届く範囲。ローカル変数はここに置かれます。関数が終わると自動的に片付けられます。非常に高速ですが、置ける量には限りがあります(数MB程度)。
- ヒープ (倉庫): 広大なスペース。画像データやデータベースなど、大きなものはここに置きます。ただし、自分で取りに行き(malloc)、使い終わったら自分で返す(free)必要があります。
違いをコードで見る
Stack
// スタック変数void func() { int a = 10; // スタックに置かれる int arr[100]; // これもスタック // 関数が終わると自動で消える}
// ❌ スタックオーバーフローvoid crash() { int big[1000000]; // 巨大すぎる!(数MBしかない) // 実行時にクラッシュ}Heap
// ヒープ変数void func() { // 倉庫から借りてくる (malloc) int *big = (int*)malloc(sizeof(int) * 1000000);
// ...使う...
// 自分で返す (free) free(big);}実践テクニック
基本はスタック
メモリ管理は面倒です。サイズが決まっていて、それほど大きくない(数KB以内)なら、スタック変数を使うのが一番安全で高速です。「どうしても必要なときだけヒープ」にするのが賢い戦略です。
演習課題
課題1: 限界を知る
再帰関数を無限に呼び出すプログラム(ベースケースなし)を書き、実行してクラッシュ(Stack Overflow)させてみてください。これが「机がいっぱいになった」状態です。
合格ライン
スタック変数が自動で消えることを知っている
巨大な配列をスタックに置くと危険な理由を説明できる