アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (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));
}
}

この回答への補足

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

補足日時:2005/10/21 10:39
    • good
    • 0

#3>これをスタックオーバーフローを起こさないようにするためには、


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

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

お礼日時:2005/10/21 14:01

Javaで書くもっとも簡単な(短い)スタックオーバーフローを起こすものといえばこんな感じでしょう。


永遠に自分を呼びつづけるので一瞬で落ちます。

public class ErrorTest {
public static void main(String[] args) {
main(args);
}
}
    • good
    • 0

メソッドの呼び出しをすると、そのメソッドが終了したら呼び出し元に制御が戻りますよね?



これを実現するため、どこから呼んだのかを記録しておくのがスタックです。

ですから、ものすごくたくさんの回数のメソッドの呼び出しを行えば、スタックに記録しきれなくなりスタックオーバーフローが発生します。

ではどのくらい呼び出せばオーバーフローするかというと、とにかくたくさんで、普通にプログラムを作ったぐらいではオーバーフローはまず起こりません。

あとは自分で考えてみてください。
    • good
    • 3

スタックオーバーフローとはスタック(変数などを格納するメモリ領域)で発生するバッファオーバーフローのことです。

バッファオーバーフローについては参考URLで解説しています。
ただJavaではスタックオーバーフローが起こってもStackOverflowError()にスローされるので致命的な事態にはなりません。

Javaでは配列やStringではスタックオーバーフローを起こせません。そこで、再帰関数による無限ループなどを実行することでスタックオーバーフローエラーが起こります。

参考URL:http://e-words.jp/w/E38390E38383E38395E382A1E382 …

この回答への補足

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

補足日時:2005/10/20 17:02
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!