スタック領域とは?C言語のStackの仕組みとヒープとの違いを解説

目次

メモリ領域解説シリーズ

本記事は「メモリ領域解説」シリーズの1つです。

メモリ領域解説シリーズの全体像はこちら

C言語のプログラムでは、メモリは複数の領域に分かれて管理されています。

例えば次のような領域があります。

  • text領域:プログラムのコード
  • data領域:初期値ありのグローバル変数
  • bss領域:初期値なしのグローバル変数
  • heap領域:mallocで使用する動的メモリ
  • stack領域:関数呼び出しで使用するメモリ

この中でも **プログラムの実行に強く関わるのが「スタック領域」**です。

この記事では

  • スタック領域の役割
  • スタックの仕組み
  • ヒープとの違い

実務の視点も交えて解説します。


スタック領域とは

新人さん

スタック領域って、メモリ構造の図ではよく見るんですが…
実際には何を保存しているんですか?

エンジニアくん

主に関数の実行に必要な情報を保存しているんだ。
ローカル変数や戻りアドレスなどがスタックに積まれるよ。


**スタック領域(Stack)**とは、
関数呼び出し時に使用されるメモリ領域です。

主に次の情報が保存されます。

  • ローカル変数
  • 関数の引数
  • 戻りアドレス
  • 保存されたレジスタ

関数が呼び出されると、
これらの情報が スタックに積まれる(push) 仕組みになっています。

そして関数が終了すると、
そのデータは スタックから取り出され(pop)、メモリが解放されます。


スタックの特徴

スタック領域には次の特徴があります。

LIFO構造(後入れ先出し)

スタックは LIFO(Last In First Out) の構造を持っています。

つまり

  • 最後に積まれたデータ
  • 最初に取り出される

という仕組みです。

例えば次のような関数呼び出しがあるとします。

main()
 └ funcA()
     └ funcB()

この場合、スタックには次の順でデータが積まれます。

funcB
funcA
main

そして関数終了時は 逆順で戻ります。


自動管理される

スタックのメモリは プログラムが自動で管理します。

つまり

  • malloc
  • free

のような 手動メモリ管理は不要です。

関数が終了すると、そのスタックフレームは自動的に解放されます。

このため、スタックは 高速にメモリ管理できるという特徴があります。


スタックとヒープの違い

初心者さん

スタックとヒープって、どっちもメモリですよね?
何が違うんですか?

エンジニアくん

一番大きい違いは、メモリ管理の方法だね。


スタックとヒープの主な違いは次の通りです。

項目スタックヒープ
用途関数実行動的メモリ
管理方法自動管理プログラマ管理
速度高速比較的遅い
サイズ小さい大きい

ヒープ領域は、主に mallocなどの関数で動的にメモリを確保するために使用されます。

ヒープについては、こちらの記事で詳しく解説しています。


スタックオーバーフローとは

スタック領域には サイズの上限があります。

そのため、スタックを使いすぎると
スタックオーバーフローが発生することがあります。

代表的な原因は次の通りです。

  • 深い再帰呼び出し
  • 大きすぎるローカル配列

例えば次のコードです。

void func() {
    int buffer[100000];
}

このように 大きな配列をローカル変数として確保すると
スタックを圧迫する可能性があります。

その場合は

  • ヒープを使用する
  • 配列サイズを見直す

などの対策が必要です。


メモリ構造の中でのスタック

C言語のプログラムでは、メモリは一般的に次のような構造になっています。

FlashとRAMの分離、およびHeapとStackの衝突関係

スタックは 高アドレス側から上方向に伸びることが多く、
ヒープは 低アドレス側から下方向に伸びる構造になっています。


まとめ

スタック領域は、関数の実行に必要な情報を保存する重要なメモリ領域です。

ポイントをまとめます。

  • スタックは関数呼び出しで使用される
  • ローカル変数や戻りアドレスが保存される
  • LIFO構造を持つ
  • メモリは自動管理される
  • ヒープとは用途と管理方法が異なる

C言語のメモリ構造を理解する上で、
スタック領域とヒープ領域の違いは非常に重要なポイントです。

この記事が参考になった方へ

メモリ領域については他の記事でも解説しています。

メモリ領域解説シリーズの全体像はこちら

技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。

小さなご相談からでもお気軽にご連絡ください。

お問い合わせはこちら

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする


目次