スタックオーバーフロー
出典: フリー百科事典『ウィキペディア(Wikipedia)』
スタックオーバーフロー (stack overflow) は、プログラム中での関数呼び出しが多すぎる時に発生する。言語やコンピュータ(最大でも利用可能なメモリ量が上限)によるが、コールスタックに格納できる関数の数には(充分大きいが)上限がある。関数呼び出しが多すぎるとスタックは「オーバーフロー」し、プログラム側で対策をとっていなければ通常はクラッシュしてしまう。
スタックオーバーフローの一番の原因は無限ループである。末尾最適化を実装した言語では、ある特定の無限再帰(末尾再帰)を行なうことができ、末尾再帰ではスタックオーバーフローは起こらない。末尾再帰は「引数付きのGOTO」に最適化されるので、それで余計にスタックを消費することは無いからである。
他のよくある原因としては、スタック上に巨大な配列を確保しようとすることである。
[編集] C/C++ での例
int f(){ g(); } int g() { f(); }
f()
は g()
を呼び出しているが、g()
もやはり f()
を呼び出している。最終的にはスタックオーバーフローが発生する。
巨大な配列をスタックに配置した場合:
int main() { int n[10000000]; // 配列が大きすぎる int j =0; // jのアドレスがスタックの限界を超えてエラー }
[編集] 関連項目
カテゴリ: バグ | コンピュータ関連のスタブ項目