多くの若いプログラマーと同じように、コードのさまざまなポイントに「here1」、「here2」などの多数の print-to-console ステートメントを挿入して、プログラムがいつうまくいかないかを把握することの有用性を学びました。このブルート フォース デバッグ手法は、CS の研究を通じて何度も私を救ってくれました。しかし、C でプログラミングを始めたとき、興味深い問題に出くわしました。走ってみたら
void* test;
printf("hello world");
test[5] = 234;
もちろん、testCharのメモリをmallocしていないため、セグメンテーション違反が発生します。ただし、それがコードの流れであるため、セグフォルトが発生する前に「hello world」が出力されると論理的に考えるでしょうが、私の経験では、セグフォルトが最初に発生し、「hello world」が常に発生する場合があります。 " がコンソールに出力されることはありません。(この正確な例をテストすることはできませんでしたが、Linuxボックスでgccを使用してこの種の状況に何度も遭遇しました。)これは、コンパイラがいくつかのものを再配置したり、printfを実行したりすることに関係していると推測しています非同期的にフラッシュされるため、即時ではないある種のバッファを使用します。正直なところ、なぜそうなるのかはわからないので、これは完全に私の推測です。私が使用した他の言語では、「testChar = ...
私の質問は、C をプログラミングしているときになぜこれが起こるのですか? hello world が最初に出力されないのはなぜですか? 次に、同じ基本的なことを達成するこれよりも優れた C プログラミングのデバッグ手法はありますか? のように、問題のあるコード行を見つけるための簡単で直感的な方法は?
編集:私は偶然に実際の例を挙げました。私が今持っているものは、セグメンテーション違反を引き起こすはずです。おもしろいことに、セグメンテーション違反が必要ないときは通常、セグメンテーション違反を取得しますが、実際にセグメンテーション違反が必要な場合は、正当なコードを記述します!