【すたっくおーばーふろー】

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

💡 関数呼び出しが「積み重なりすぎて」崩壊する
📌 このページのポイント
スタックオーバーフロー(メモリ溢れ) 正常なスタック スタック上限 空き領域 関数C 関数B 関数A main スタックオーバーフロー スタック上限 溢れた! func() func() func() func() func() func() main 無限再帰などでスタック領域を使い果たすとプログラムがクラッシュする
スタックオーバーフローのイメージ
ひよこ ひよこ

コールスタックって何?

ペンギン先生 ペンギン先生

関数を呼び出すたびに「今どこにいるか」「ローカル変数の値」「呼び出し元の場所」をスタック(後入れ先出しの構造)に積む。関数が終わると情報を取り出して呼び出し元に戻る。この積み重ねが深くなりすぎるとメモリが足りなくなって、スタックオーバーフローが発生するんだよ

ひよこ ひよこ

どうやって直す?

ペンギン先生 ペンギン先生

再帰関数の終了条件(ベースケース)を確認する。無限再帰になっていないか?②再帰の深さを減らすアルゴリズムに変更する。③再帰ループに書き換える(末尾再帰最適化が使えない言語では特に重要)。④どうしても深い再帰が必要なら、言語のスタックサイズ上限を増やす方法もあるけど根本解決にはならないよ

ひよこ ひよこ

再帰以外でも起きる?

ペンギン先生 ペンギン先生

あるよ。①関数A→B→C→A→...の相互再帰、②巨大な構造体をスタックに確保(alloca等)、③非常に深いネストJSON/XMLパースする再帰下降パーサー。組み込みシステムではスタックサイズが小さい(数KB)ので、通常の処理でも起きることがあるよ

ひよこ ひよこ

おもしろい!Q&AサイトのStack Overflowとの関係は?

ペンギン先生 ペンギン先生

プログラマー向けQ&AサイトのStack Overflowは、まさにこのエラーから名前を取ったんだ。プログラミングで「詰まった(オーバーフローした)」時に助けを求める場所、というシャレ。2008年のサービス開始以来、世界中のプログラマーの知恵袋になっていて、ほぼ全てのプログラミングエラーの解決策が見つかるよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「スタックオーバーフロー」って出てきたら「関数の呼び出しが深すぎてメモリが溢れるエラー」と思えればだいたいOK!
📖 おまけ:英語の意味
「Stack Overflow」 = スタック溢れ
💬 Stack(積み重ね)がOverflow(溢れる)。函数呼び出しの積み重ねが限界を超えるんだよ
← 用語集にもどる