• 締切済み

おかしな現象が発生 問題の関数内のスタックが原因?

VisualC++2005でプログラムを書いているのですが、おかしな現象が発生しまして、皆さんも似たような経験をされたかどうかお聞きしたいです。 C言語の関数の動作テストしているのですが、問題の関数をコールした後、通るべきプログラムを飛ばして、次の行の命令から実行されます。 具体的には、n=a();という関数がありまして、 戻ってきた位置に if (n == 0) { // ------------------ (A) printf("通過すべき場所"); } があり、デバッグの自動変数ではnは0,であるため、「通過すべき場所」が 表示されるはずですが、実行中もでバック中もここを飛ばして、次の行から動作しています。 問題のa()はコールした時はアセンブラのような画面が出てきたので、おかしいなと思ったのですが、(A)の位置にブレークポイントを置きそこまで走らせると、そこで止まり、F11でステップインさせると、飛ばして別の行へいきます。 問題のa()内のスタックが壊れているのでしょうか? もう一度a()の関数を書きなおして、中で定義している配列の大きさなど調べた方が良いのでしょうか?

みんなの回答

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.8

スタックサイズに関する補足を書くよりも、 ソースコードを載せる方が解決への近道である、 と思うのは私だけでしょうか。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.7

スタックの破壊とスタックサイズは基本的に関係がありませんよ。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.6

そういうときは、 n=a(); をコメントアウトして、 n=0; と書いてみて、動作を確認するのがよいです。 これでprintfが実行されたなら、a()が怪しいし、やっぱり実行されないなら、原因はa()以外のところにある可能性が高い。

  • BLK314
  • ベストアンサー率55% (84/152)
回答No.5

私もスタックを壊している気がします。 皆さんがおっしゃるように、 配列の終わりを越えて書き込んだ可能性もあります。 もう一つは "再帰"で終わらなくなってしまう場合です。 念のため、解説します。 ”再帰”とは関数の実行途中で自分自身を再度呼び出すことです。 ”再帰"はきちんと作られていれば、便利なのですが、 誤っていた場合(return が実行されない場合) あっという間にスタックが消費されてしまいます。 私も、たまにやるのですが、 C++のvirtual 関数で派生クラスの関数から 基本クラスの関数を呼び出す際に ついうっかり 基本クラス:: をつけるのを忘れることがあります。 これは、自分では再帰なんて使っていないつもりでも 再帰になってしまいます。 このように、自分でも気づかないうちに、再帰になる可能性もありますので 調べてみてはいかがでしょうか?

bazax
質問者

補足

ご回答ありがとうございます。 スタックのサイズはデフォルトがわかりませんが プロパティ  構成プロパティ   C/C++    コマンドライン 追加のオプション /F 1000000000 953MBのスタックで約1Gのスタックはできるのでしょうか? また、実行ファイル(exeファイルから)スタック領域がわかる方法があるのでしたら知りたいです。

  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.4

私もスタックか何か分からないが壊れていると思います。 n=0とのことですが、if(n==0)の前後に念のためにnを printしたいですね。デバッガ見たものでなく、プログラ ムが見たものを知りたいです。

  • apple_mon
  • ベストアンサー率100% (1/1)
回答No.3

説明が理解できない。 ソースを10行程度貼った方が回答者の負担が少なくてすむんじゃないだろうか。 感覚的には最適化が聞いているのが問題なような気もするけど。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

(A)の前後のコードと、a()の中身を見せてください。

回答No.1

スタックが壊れているんだろうね? n=a();の前に定義したバッファかなんかにデータを移す命令はありませんか? 多分バッファオーバーフローとかのスタック破壊と思われます。 バッファの定義を大きくしたら解決するかも?

専門家に質問してみよう