プログラムのメモリの仕組み「スタック / ヒープ」とは?C言語の基本をやさしく解説!
C言語では、変数やデータを保存するためにメモリを使います。
このとき主に使われる領域が、スタック(Stack)とヒープ(Heap)です。
それぞれの特徴や使い方を理解して、安全で効率の良いプログラミングを目指しましょう!
スタックとは?
スタックは、関数の呼び出し時に自動的に使われるメモリ領域です。
ローカル変数(関数の中で宣言された変数)はスタックに保存されます。
- 関数が呼び出されると領域が「積まれる」
- 関数が終わると領域が「自動で解放される」
- 高速で扱えるが、使える容量が限られている
スタックの使用例
void func() {
int a = 10; // aはスタック領域に保存される
}
ヒープとは?
ヒープは、プログラム実行中に必要な分だけメモリを「手動で」確保・解放する領域です。
動的メモリ確保(malloc()
やfree()
)によって管理されます。
malloc
で確保、free
で解放
- サイズを柔軟に決められる(配列のサイズが実行時に決定できる)
- 解放を忘れるとメモリリークが発生
ヒープの使用例
int *arr = (int *)malloc(sizeof(int) * 10); // ヒープにint型10個分確保
if (arr != NULL) {
arr[0] = 1;
free(arr); // 必ず解放!
}
スタックとヒープの違い
項目 |
スタック |
ヒープ |
確保方法 |
自動(関数呼び出し時) |
手動(malloc / free) |
解放方法 |
自動(関数終了時) |
手動(free) |
用途 |
関数内のローカル変数など |
実行時にサイズが決まるデータ |
容量 |
少ない |
比較的多い |
アクセス速度 |
速い |
やや遅い |
注意点
- ヒープは free を忘れるとメモリが無駄になる
- スタックは 使いすぎるとスタックオーバーフローになる
まとめ
スタックは短期間・高速・自動管理、ヒープは長期間・柔軟・手動管理が特徴です。
C言語ではこの2つのメモリ領域を理解して使い分けることで、効率的で安全なプログラムが書けるようになります。
初心者の方はまず、malloc
で確保したメモリはfree
で必ず解放する、という習慣をつけましょう!