セグメンテーションフォールトの質問
-
19-09-2019 - |
質問
私たちはどこにでもセグメンテーションフォールト前にコードでprintf
を持っている場合、時にはCプログラムでは、それが印刷されないことを観察しました。これはなぜでしょうか?
解決
printf()
からの出力がバッファリングされているため、それはです。あなたはすぐにあなたのfflush(stdout);
後printf
を追加することができますし、それを印刷します。
また、あなたがこれを行うことができます:
fprintf(stderr, "error string");
stderr
がバッファリングされていないため。
関連する質問するもあります。
他のヒント
セグメンテーションフォールトがprintfの後もすぐに発生し、出力バッファがフラッシュされていなかった場合は、printf関数の効果は表示されません。
ほとんどのlibc実装バッファのprintf出力。これは、バッファの内容をフラッシュすることを強制するために、出力文字列に改行(\ n)を追加するために通常は十分です。
あなたはそれがワンセグ障害の前に行われることを確保するためには、右のprintfた後、出力バッファをフラッシュすることができます。例えば。 fflushは(標準出力)
ランダムヒント:あなたは、デバッグセグメンテーションフォールトにしようとしている場合は、 valgrindのを試してみてください。それははるかに簡単になります!
あなたは、出力ストリームのバッファリングを指摘回答数を与えてきます。
良くも悪くも、それはしかし、唯一の可能性にどこにも近いです。セグメンテーションフォールトは、OSを使用すると、一般的に割り当てられたメモリから外部に書かれた、何か間違ったことをやったことを検出したことを意味します。 (ほとんどが悪化し)良くも悪くも、ほぼの何かを行うためののような状況では、プログラムがどこにそれを状況に/少なくとも一度、検出されることから問題を回避するために内部で何をするかを十分に変更することができます以前に検出されました。
以前と呼ばれるのだが、機能上の適切な場所にその値を残しているため、特定の値(おそらくいくつかの小さな整数)を保持するために起こった -たとえば、セグメントの障害が初期化されていないポインタを通して書き込むことによって引き起こされている可能性があり後で関数が呼び出され、ポインタとして同じ値を使用したスタックは、それが(合理的にdependably)OSは、あなたが書くことが許されなかった場所として検出された値が含まれています。 printfの呼び出しで入れて、しかし、あなたは初期化せずに使用しているスタック上のスポットで、いくつかの完全に異なる値を残している意味するかもしれません。あなたはまだあなたがいけないどこかに書いているが、それは今OSががはあなたが書いすべきではありません知っていないことをどこかにあるかもしれない。