• ベストアンサー

printf()がないとエラー

現在、素因数分解プログラムを作っていて値を確認するために使って いたprintf()を取り除いて完成というところだったのですが、50の 倍数のときにセグメントエラーになり、再びprintf()を付け加えると 正常に動作するという不可解な現象が起きました。 こんな場合は、どんなことが起きていると考えられますか? そして、1回も使ったことがないのでよくわかりませんが、デバッガ を使えば原因がわかるものでしょうか? 回答よろしくお願いします。

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

  • ベストアンサー
  • hosuke_dx
  • ベストアンサー率33% (4/12)
回答No.2

printf()を付け加えていない時 「たまたま動いている状態」と考えるのが妥当だと 思います。 机上デバッグでまず、50の倍数の系を丹念に追いましょう。 それでもわからないならデバッガで、セグメントエラーに なる瞬間を捕まえましょう。 デバッガを使えば、エラーになる要因がわかるはずです。 が、タイミング関連のバグであれば、デバッガを使うと printf()を外しても、セグメントエラーが起きなくなったり することもありますね。(その逆-つまり、printf()を つけているのに落ちるということ-もありますが。) ご健闘をお祈りします。 バグ退治、がんばってください。

その他の回答 (2)

  • Kizz
  • ベストアンサー率47% (30/63)
回答No.3

曖昧な意見ですが・・。 処理に直接関係のない処理文の有無によって動きに変化がある場合には、可能性としてメモリーリークが上げられます。 ※絶対とはいえませんが、その場合がおおにしてかと。 nullアクセス。初期化抜け。変数領域オーバー格納とか。 トレースして変数のアドレス値の動きを確認するのが良いと思います。 ※デバッカーを使うとアドレス値の確認は容易になりますが、デバッカーは領域をきれい勝手にやってくれて不具合が出ないようになる、なんて悩ましい場合もあったりもします。。 処理を確認しているブロック(関数内とか)で定義している変数、またはそのブロック内で使用するグローバル変数もあればそれも対象にし、確認してみるのも良いかと。 上記理由とは限定できませんので、あくまでも「ありえるケース」として受け止めてください。

noname#41855
noname#41855
回答No.1

初期化していないポインタかローカル変数を使ってたりしませんか? ポインタが示す先の領域をちゃんと確保しているか? または ローカル変数(関数の中で宣言している変数)を値をセットせずに参照していないか? を、チェックしてみてください。

ume-kun
質問者

お礼

やっとバグが取れました!ループの中で確保していない領域に アクセスし続けていてループから抜け出せない状態でした。 つまらない質問に意見をくださってhosiharaさん、hosuke_dxさん、 Kizzさん ありがとうございました!

ume-kun
質問者

補足

回答ありがとうございます。これからチェックしてみます。