为什么我能摆脱seg.如果我把printf()错了?

use*_*840 1 c

我的程序有一些列表处理函数,一切正常,直到我添加了reverseLinkedList函数.我观察到有一个段.错误错误,后来我通过添加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;
}
Run Code Online (Sandbox Code Playgroud)

Die*_*Epp 6

您已经发现printf()实际上并没有解决代码中的问题,它只是掩盖了问题,因此您不会遇到分段错误.

段故障是一个很好的事情,因为它可以帮助你发现在你的代码中的错误.添加时printf(),错误仍然存​​在,但分段错误消失了......因此找到错误更加困难.

C程序中的内存错误可能导致非常奇怪的行为.基本上,如果你的程序有内存错误,任何事情都可能发生,在这种特殊情况下,实际发生的事情取决于该printf()调用是否被执行.可能需要一些调查才能确切地知道这里发生了什么,但是有可能(例如)你的一些代码依赖于未初始化的内存,并printf()在该内存中留下一些值导致你的其他代码无害地进行.

您可以使用许多不同的工具来诊断这些问题.

  1. 由于您的代码会出现分段错误,因此您可以连接调试器并查看崩溃的位置.错误的代码可能会崩溃,或者在执行错误代码后很长时间内可能会发生崩溃.

  2. Valgrind经常会告诉你程序的哪些部分依赖于未初始化的值,这是这种崩溃的常见原因.

  3. Mudflap(编译gcc -fmudflap)也会发现其中一些错误.Mudflap和Valgrind有很多重叠,但有时其中一个会发现另一个没有的错误.