制御スタック(せいぎょすたっく)
最終更新:2026/4/27
制御スタックは、プログラムの実行中に一時的にデータを保存するために使用される、後入れ先出し(LIFO)のデータ構造である。
別名・同義語 コールスタックスタックフレーム
ポイント
制御スタックは、関数呼び出し、ローカル変数の保存、割り込み処理など、様々な場面で利用され、プログラムの実行フローを管理する上で不可欠な役割を果たす。
制御スタックとは
制御スタックは、コンピュータプログラムの実行において、関数呼び出しや復帰、ローカル変数の管理、割り込み処理など、様々な制御情報を一時的に保存するために用いられるデータ構造です。スタックは、後入れ先出し(LIFO: Last-In, First-Out)の原則に基づいて動作し、最後に格納されたデータが最初に取り出されます。
制御スタックの役割
- 関数呼び出しと復帰: プログラムが関数を呼び出す際、関数の戻りアドレスや引数などの情報が制御スタックにプッシュ(格納)されます。関数が実行を終えると、スタックからこれらの情報がポップ(取り出し)され、呼び出し元に戻ります。
- ローカル変数の保存: 関数内で宣言されたローカル変数は、制御スタック上に確保されます。これにより、関数が終了しても、他の関数のローカル変数と干渉することなく、データの整合性が保たれます。
- 割り込み処理: 割り込みが発生すると、現在のプログラムの状態(レジスタの値、プログラムカウンタなど)が制御スタックに保存されます。割り込み処理が完了すると、スタックから状態が復元され、中断されたプログラムの実行が再開されます。
制御スタックの構造
制御スタックは、通常、メモリ上に連続した領域として確保されます。スタックポインタと呼ばれるレジスタが、スタックの先頭アドレスを指し示します。データのプッシュ操作では、スタックポインタをデクリメント(減算)し、データを格納します。ポップ操作では、スタックポインタをインクリメント(加算)し、データを読み出します。
スタックオーバーフロー
制御スタックの容量には制限があり、プッシュ操作を過剰に行うと、スタックオーバーフローが発生します。スタックオーバーフローは、プログラムの異常終了やセキュリティ上の脆弱性につながる可能性があります。再帰呼び出しが深すぎる場合や、大量のローカル変数を宣言した場合に、スタックオーバーフローが発生しやすくなります。