- ベストアンサー
エラーについて
プログラムをコンパイルはできるのですが、実行するとエラーが出てしまいます。 run-time error R6000 -stack overflow と出るのですが、これはどういう意味なのでしょうか? どこを直せばいいのかわからず困っています。よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
スタックとはメモリの一部で、主にローカル変数の確保や関数呼び出し元のアドレス保存、関数へのパラメータ受け渡し領域として使われます。 stack overflowとは、スタックとして割り当てられているメモリ領域を使い切ってしまったというOSからのエラーメッセージです。 考え得る原因はpunchan_jpさんのおっしゃる通りです。その中でも一番ありがちなのが、巨大な配列の関数内確保ですね。 簡単な解決策はグローバル変数にすることです。グローバル変数はスタックとは別のメモリ領域に確保されます。関数内でもstaticを付けて宣言すれば同様になります。 また、mallocによってメモリを動的確保するのも手です。この場合初期化はできませんが。 再帰関数の終了条件設定ミスもよくあります。これはアドバイスできる範疇ではないので、もし思い当たるならば、補足辺りにその関数を載せてもらわないと回答はムリですね。
その他の回答 (3)
- a-kuma
- ベストアンサー率50% (1122/2211)
使っているのは Visual C (もしくは MSC) ですよね。 コマンドラインでコンパイルをしているのであれば、 /F オプションで 指定します。 d:\> cl /F20000000 ... プロジェクトを作っているのであれば、プロジェクトの設定で、「リンク」 というタブがあるはずで、そこでスタックのサイズを指定できます。 多分、「スタックアロケーション」の「リザーブ」となっているはず。 指定は、バイト単位で、デフォルトでは 1Mbyte なので、それよりも 大きな数字を設定することになります。 もし、スタックが足りなくなっている原因が関数の呼出しが深すぎる ことが原因であれば、スタックサイズの指定をしても問題は解決しません。 プログラムの見直しをしましょう。 ただし、普通の呼出しかたでは、めったにこうなることはありません。 プログラムの中で、関数の再帰呼出しをしていなければ、スタックサイズの 指定でいけるはずです。
お礼
ありがとうございました!おかげで解決し、実行できるようになりました!!
- punchan_jp
- ベストアンサー率55% (155/280)
stack overflowということは、関数の呼び出しが深すぎるか、 関数にローカルな変数が多すぎるかです。 関数から自分自身を呼び出す再帰呼出しをしていて、 その終了条件が誤ってませんか? 巨大な配列変数を関数内で宣言していませんか? もし、それらに問題ない場合、stack のサイズが小さすぎるのかもしれません。 UNIXであればシェル内で stack のサイズを増やすことができると思います。 とはいえ、デフォルトの stack サイズでも overflow しないように書くのが 本筋でしょう。
お礼
ありがとうございました!おかげで解決し、実行できるようになりました!!
- j_euro
- ベストアンサー率25% (29/115)
コンパイルオプションのスタックサイズを大きく設定するか、スタックチェックをしないように設定して下さい。 (あれ、リンカオプションだったかな?) OSとコンパイラ(出来ればバージョンも)をはっきりさせないと正解は来ないかも、 メッセージは、MS-DOSのMSCににているけど。
お礼
ありがとうございました!おかげで解決し、実行できるようになりました!!
お礼
ありがとうございました!おかげで解決し、実行できるようになりました!!