• ベストアンサー

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

スタックオーバーフローを起こす簡単プログラムを作れって、 大学の教授に言われたんですけど、さっぱり分かりません。 コンパイルと実行の仕方しかわからない自分にそんな過酷な課題を・・・ 誰か助けてください。 そもそもスタックオーバーフローってなんなんですかね・・・。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

スタックオーバーフローについては既に説明があるので、 サンプルプログラム こんな感じでスタックを浪費するプログラムを作ればいいと思います。 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)); } }

g44018
質問者

補足

これをスタックオーバーフローを起こさないようにするためには、 何か1文加える必要があるのでしょうか? 本当に素人なんで、初歩的な質問ですみません。

その他の回答 (4)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

#3>これをスタックオーバーフローを起こさないようにするためには、 答えの求め方自体に問題があるので、別の方法にするとか 例えばn*(n+1)/2で答えが求められます。 そうではなくて、例外が起こったときにもプログラムが終了しないようにするという意味ならエラーが起こりそうなところをtry{ }で囲み、catch{}で例外発生時の処理をします。

g44018
質問者

お礼

例外が起こったときにもプログラムが終了しないようにするという意味です。 質問があいまいで申し訳ありませんでした。 try{ } catch{ } という方法があるということは、非常に勉強になりました。 ありがとうございます。

回答No.4

Javaで書くもっとも簡単な(短い)スタックオーバーフローを起こすものといえばこんな感じでしょう。 永遠に自分を呼びつづけるので一瞬で落ちます。 public class ErrorTest { public static void main(String[] args) { main(args); } }

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.2

メソッドの呼び出しをすると、そのメソッドが終了したら呼び出し元に制御が戻りますよね? これを実現するため、どこから呼んだのかを記録しておくのがスタックです。 ですから、ものすごくたくさんの回数のメソッドの呼び出しを行えば、スタックに記録しきれなくなりスタックオーバーフローが発生します。 ではどのくらい呼び出せばオーバーフローするかというと、とにかくたくさんで、普通にプログラムを作ったぐらいではオーバーフローはまず起こりません。 あとは自分で考えてみてください。

  • tsuna555
  • ベストアンサー率53% (22/41)
回答No.1

スタックオーバーフローとはスタック(変数などを格納するメモリ領域)で発生するバッファオーバーフローのことです。バッファオーバーフローについては参考URLで解説しています。 ただJavaではスタックオーバーフローが起こってもStackOverflowError()にスローされるので致命的な事態にはなりません。 Javaでは配列やStringではスタックオーバーフローを起こせません。そこで、再帰関数による無限ループなどを実行することでスタックオーバーフローエラーが起こります。

参考URL:
http://e-words.jp/w/E38390E38383E38395E382A1E382AAE383BCE38390E383BCE38395E383ADE383BC.html
g44018
質問者

補足

FORTRANでも同じことが言えるのでしょうか?

関連するQ&A