• ベストアンサー

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

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

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

  • ベストアンサー
  • 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

  • VBでスタックオーバーフロー

    VisualBasic6でハノイの塔のプログラムを書いたのですが、スタックオーバーフローが表示されて困っています。VBでスタックを明示的に増やすことは可能でしょうか?

  • C# 再帰よるスタックオーバーフローについて

    VB2008 C# でプログラムしていますが、 プログラムで再帰を多く行わなくてはならず、 スタックオーバーフローが出てしまいます。 スタックオーバーフローを解決するためには、アルゴリズムを変更し、 再帰の回数を減らすしか方法はないのでしょうか? もしスタックの上限を変更する方法などがありましたら教えてください。 VBは初心者なので、なるべく簡単にお願いします。

  • スタックオーバーフロー

    Windows98起動後、ネットワークに接続するためユーザー名 とパスワードを入力したところ、以下のようなメッセージ が表示されました。 「スタックオーバーフローのため、スレッドを停止しています。 最近インストールされたVxDがスタックを消費しすぎている可能性があります。 SYSTEM.INIの“MinSPs”設定を増やすか、最近インストールされたVxDを削除してください。 現在4SP がアロケートされています。どれかキーを押すと続行します。」 SYSTEM.INIの中を見ても"MinSPs"という文字列は見当たりません。 "現在4SPがアロケート"ということであればSYSTEM.INIの中で"MinSPs=4"とすればいいのかと推測してますが、どのセクションに記述すればいいのかわかりません。 そもそも"MinSPs"は何でしょう?? ご存知の方教えてください。

  • gccでスタックオーバーフローのチェック

    OS:WindowsXP コンパイラ: MinGW gcc 3.3.3 gccで、スタックオーバーフローの検出を行いたいと思っています。 gcc -v --helpで見ると > -fstack-check Insert stack checking code into the program と書かれているので、そのように指定して、無限に自分を呼び続ける再帰のプログラムを走らせてみました。 gcc -fstack-check testS2.c  ですが、オプションを指定しない時と同じように突然何の前触れもなく終了してしまいます。  このオプションはスタックを使い切るかどうかをチェックするオプションではないのでしょうか。  よろしくお願いいたします。

  • .NET(C#)でのスタックオーバーフロー回避方法

    ASP.NET初心者です。初めて質問させていただきます。 ASP.NET(C#)でwin32系の外部ライブラリを使用したいのですが、そのライブラリを読み込むところで スタックオーバーフローが発生してしまいます。 同じライブラリをWindowsアプリケーション(C#)で使用したところ問題なく実行できました。 ASP.NETで同じように使用しようとするとスタックオーバーフローが発生してしまう状態です。 [デバッグ中のエラーメッセージ] xxxx.dllを読み込めません。再帰が深すぎます。スタックがオーバーフローしました。 [イベントログ] 障害が発生しているアプリケーション名: w3wp.exe、バージョン: 7.5.7600.16385、タイム スタンプ: 0x4a5bcd2b 障害が発生しているモジュール名: xxxx.dll_unloaded、バージョン: 0.0.0.0、タイム スタンプ: 0x4d92e27c 例外コード: 0xc0000005 xxxx.dllは、今回使用したいDLLです。 過去の質問等でスタックオーバーフローが発生した場合の解決策を探してはみたのですが、見つけられた方法が以下の2つでどちらもうまくいきませんでした。 (1)スタック領域を大きくする →スレッドでスタック領域を指定して実行してみました。 (2)ライブラリの中身をスタックオーバーフローが起きないように変更する → ライブラリの中身は変更できない状態です。 (1)のほうは、指定方法間違えてるかもしれません。。。 Thread newthread = new Thread(new ThreadStart(init), 0); もしくは、w3wp.exeでエラーが発生しているということはIIS関係で何かおかしなことをしてしまってるのかもとか・・・。 根本から見方が間違ってるかもしれませんが、(1)の方法の正しいやり方、もしくはそれ以外の解決策をご教授頂きますようよろしくお願いいたします。

  • C#のスタック領域

    C#でA*のアルゴリズムを用いたプログラムを作成しています。 しかし、探索範囲によってスタックオーバーフローを起こします。 スタック領域そのものを増やすことはできないのでしょうか? よろしくお願いします。

  • スタック実行の無効化?

    バッファオーバーフロー対策として、スタック実行の無効化という言葉をよく聞きますが、これは具体的にはどういったことなのでしょうか。 スタックやヒープという言葉の意味もよくわかっていないので、教えてください。 よろしくお願いします。

  • バッファオーバーフローで疑問があります。

    スタックのバッファオーバーフローで、バッファオーバーフローを起こすことで、変数領域の内容が上書きされ、さらにスタックのその他の領域(サブルーチンの戻りアドレスなど)までも書き換わってしまうとありますが、なぜそんなことが起きるのでしょうか? 私のイメージ的に、スタックの内容が以下のようだとして、 |          | | 変数領域(B) | |------------| | 変数領域(A) | |------------| | SFP       | |------------| | 戻りアドレス | |------------| | 関数の引数  | |------------| バッファオーバーフローが起きたとしても上書きされるのは 変数領域A,Bだと思ったのですが、スタックには最大領域でも決まっていてそれおも超えるデータ量の場合は、領域いっぱいまですべて上書くようにでもなっているのでしょうか? 気になって仕方がありません。 どうかよろしくお願いいたします。

  • バッファオーバーフローについて

    プログラムを書き換えてないでmakeし実行すると バッファオーバーフローになったりならなかったりします。 なぜでしょうか? 大きなプログラムは書いていません。 OS:windows7 visual studio2005

  • C++のスタック管理

    大きめの配列(2Mくらい)を宣言するとスタックオーバーフローのエラーが発生します。で、配列をstaticにしたらエラーが発生しなくなりました。 なんとなく、初期に大きいバッファを確保するならOKで実行時に確保するとNGなのかな~と思っているのですが、このあたりのことを教えていただけないでしょうか。 なんとなく2Mくらいでオーバーフローが出るのも納得できません。 よろしくお願いします。 環境:VC++ .Net + winXP