- ベストアンサー
printf()がないとエラー
現在、素因数分解プログラムを作っていて値を確認するために使って いたprintf()を取り除いて完成というところだったのですが、50の 倍数のときにセグメントエラーになり、再びprintf()を付け加えると 正常に動作するという不可解な現象が起きました。 こんな場合は、どんなことが起きていると考えられますか? そして、1回も使ったことがないのでよくわかりませんが、デバッガ を使えば原因がわかるものでしょうか? 回答よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
printf()を付け加えていない時 「たまたま動いている状態」と考えるのが妥当だと 思います。 机上デバッグでまず、50の倍数の系を丹念に追いましょう。 それでもわからないならデバッガで、セグメントエラーに なる瞬間を捕まえましょう。 デバッガを使えば、エラーになる要因がわかるはずです。 が、タイミング関連のバグであれば、デバッガを使うと printf()を外しても、セグメントエラーが起きなくなったり することもありますね。(その逆-つまり、printf()を つけているのに落ちるということ-もありますが。) ご健闘をお祈りします。 バグ退治、がんばってください。
その他の回答 (2)
- Kizz
- ベストアンサー率47% (30/63)
曖昧な意見ですが・・。 処理に直接関係のない処理文の有無によって動きに変化がある場合には、可能性としてメモリーリークが上げられます。 ※絶対とはいえませんが、その場合がおおにしてかと。 nullアクセス。初期化抜け。変数領域オーバー格納とか。 トレースして変数のアドレス値の動きを確認するのが良いと思います。 ※デバッカーを使うとアドレス値の確認は容易になりますが、デバッカーは領域をきれい勝手にやってくれて不具合が出ないようになる、なんて悩ましい場合もあったりもします。。 処理を確認しているブロック(関数内とか)で定義している変数、またはそのブロック内で使用するグローバル変数もあればそれも対象にし、確認してみるのも良いかと。 上記理由とは限定できませんので、あくまでも「ありえるケース」として受け止めてください。
初期化していないポインタかローカル変数を使ってたりしませんか? ポインタが示す先の領域をちゃんと確保しているか? または ローカル変数(関数の中で宣言している変数)を値をセットせずに参照していないか? を、チェックしてみてください。
お礼
やっとバグが取れました!ループの中で確保していない領域に アクセスし続けていてループから抜け出せない状態でした。 つまらない質問に意見をくださってhosiharaさん、hosuke_dxさん、 Kizzさん ありがとうございました!
補足
回答ありがとうございます。これからチェックしてみます。