- ベストアンサー
スタックオーバーフローとは?
スタックオーバーフローを起こす簡単プログラムを作れって、 大学の教授に言われたんですけど、さっぱり分かりません。 コンパイルと実行の仕方しかわからない自分にそんな過酷な課題を・・・ 誰か助けてください。 そもそもスタックオーバーフローってなんなんですかね・・・。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
スタックオーバーフローについては既に説明があるので、 サンプルプログラム こんな感じでスタックを浪費するプログラムを作ればいいと思います。 sum(n)は、1~nまでの数値を足し込むプログラムですが、9000あたりでスタックオーバーフローします。 sum(10000)は50005000で、単純に計算すれば、intの範囲で計算できます。 ------------------------------------------------------------ public class Calc { static int sum(int n){ if(n>0) return n+sum(n-1); else return 0; } static public void main(String[] argc){ System.out.println(sum(10000)); } }
その他の回答 (4)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
#3>これをスタックオーバーフローを起こさないようにするためには、 答えの求め方自体に問題があるので、別の方法にするとか 例えばn*(n+1)/2で答えが求められます。 そうではなくて、例外が起こったときにもプログラムが終了しないようにするという意味ならエラーが起こりそうなところをtry{ }で囲み、catch{}で例外発生時の処理をします。
お礼
例外が起こったときにもプログラムが終了しないようにするという意味です。 質問があいまいで申し訳ありませんでした。 try{ } catch{ } という方法があるということは、非常に勉強になりました。 ありがとうございます。
- 3rate-engineer
- ベストアンサー率45% (5/11)
Javaで書くもっとも簡単な(短い)スタックオーバーフローを起こすものといえばこんな感じでしょう。 永遠に自分を呼びつづけるので一瞬で落ちます。 public class ErrorTest { public static void main(String[] args) { main(args); } }
- ngsvx
- ベストアンサー率49% (157/315)
メソッドの呼び出しをすると、そのメソッドが終了したら呼び出し元に制御が戻りますよね? これを実現するため、どこから呼んだのかを記録しておくのがスタックです。 ですから、ものすごくたくさんの回数のメソッドの呼び出しを行えば、スタックに記録しきれなくなりスタックオーバーフローが発生します。 ではどのくらい呼び出せばオーバーフローするかというと、とにかくたくさんで、普通にプログラムを作ったぐらいではオーバーフローはまず起こりません。 あとは自分で考えてみてください。
- tsuna555
- ベストアンサー率53% (22/41)
スタックオーバーフローとはスタック(変数などを格納するメモリ領域)で発生するバッファオーバーフローのことです。バッファオーバーフローについては参考URLで解説しています。 ただJavaではスタックオーバーフローが起こってもStackOverflowError()にスローされるので致命的な事態にはなりません。 Javaでは配列やStringではスタックオーバーフローを起こせません。そこで、再帰関数による無限ループなどを実行することでスタックオーバーフローエラーが起こります。
補足
FORTRANでも同じことが言えるのでしょうか?
補足
これをスタックオーバーフローを起こさないようにするためには、 何か1文加える必要があるのでしょうか? 本当に素人なんで、初歩的な質問ですみません。