1

私のプログラムにはいくつかのリスト処理関数があり、reverseLinkedList 関数を追加するまではすべて正常に機能していました。セグメントがあることを確認しました。fault エラー、後で printf() を追加してエラーを「解決」することでわかりましたが、その理由はわかりません。

コードのスニペットは次のとおりです。

NODE *list_B;
void functionA();

int main ( )
{
..


   functionA();
   printf("O.o\n");// <=== if I add this line, the seg. fault is gone. Without it, I got the error
   printSummary(); //this is just printing out whatever is in list_B
}
void functionA()
{
   list_B = reverseLinkedList(list_B);
}

NODE* reverseLinkedList(NODE *head) //this is implemented in other head file.
{
    NODE *current = NULL;
    NODE *temp;

    while(head != NULL)
    {
        temp = head;
        head = head->next;
        temp->next = current;
        current = temp;
    }

    return current;
}
4

2 に答える 2

6

これはprintf()コードの問題を実際に解決するものではなく、問題を隠しているだけなので、セグメンテーション違反が発生しないことがわかりました。

セグメンテーション違反は、コード内のエラーを見つけるのに役立つため、良いことです。を追加するprintf()と、エラーはまだありますが、セグメンテーション違反はなくなりました...そのため、エラーを見つけるのが難しくなります。

C プログラムのメモリ エラーは、非常に奇妙な動作を引き起こす可能性があります。基本的に、プログラムにメモリ エラーがある場合は何でも起こり得ます。この特定のケースでは、実際に何が起こるかは、そのprintf()呼び出しが実行されるかどうかによって異なります。ここで何が起こっているのかを正確に把握するには、おそらく少し調査が必要ですが、(たとえば) コードの一部が初期化されていないメモリに依存していてprintf()、そのメモリにいくつかの値が残っている可能性があります。無害に進みます。

これらの問題を診断するために使用できるさまざまなツールが多数あります。

  1. コードでセグメンテーション違反が発生するため、デバッガーを接続してクラッシュの場所を確認できます。正しくないコードがクラッシュするか、正しくないコードが実行されてからずっと後にクラッシュが発生する可能性があります。

  2. Valgrind は、多くの場合、プログラムのどの部分が初期化されていない値に依存しているかを教えてくれます。これは、この種のクラッシュの一般的な原因です。

  3. Mudflap (でコンパイルgcc -fmudflap) も、これらのエラーの一部を検出します。Mudflap と Valgrind には多くのオーバーラップがありますが、一方がエラーを検出し、もう一方が検出しない場合があります。

于 2013-05-14T03:23:39.820 に答える
2

呼び出すprintfと、スタック上の値が変更されます。の後の関数printfがローカル変数を適切に初期化しない場合、これにより、 のprintf()有無を含め、異なる動作が発生します。

stock_name設定する前に(で)比較しているようですmalloc()。それはグローバル変数ですか?

于 2013-05-14T03:23:08.870 に答える