我的程序有一些列表处理函数,一切正常,直到我添加了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)
您已经发现printf()实际上并没有解决代码中的问题,它只是掩盖了问题,因此您不会遇到分段错误.
段故障是一个很好的事情,因为它可以帮助你发现在你的代码中的错误.添加时printf(),错误仍然存在,但分段错误消失了......因此找到错误更加困难.
C程序中的内存错误可能导致非常奇怪的行为.基本上,如果你的程序有内存错误,任何事情都可能发生,在这种特殊情况下,实际发生的事情取决于该printf()调用是否被执行.可能需要一些调查才能确切地知道这里发生了什么,但是有可能(例如)你的一些代码依赖于未初始化的内存,并printf()在该内存中留下一些值导致你的其他代码无害地进行.
您可以使用许多不同的工具来诊断这些问题.
由于您的代码会出现分段错误,因此您可以连接调试器并查看崩溃的位置.错误的代码可能会崩溃,或者在执行错误代码后很长时间内可能会发生崩溃.
Valgrind经常会告诉你程序的哪些部分依赖于未初始化的值,这是这种崩溃的常见原因.
Mudflap(编译gcc -fmudflap)也会发现其中一些错误.Mudflap和Valgrind有很多重叠,但有时其中一个会发现另一个没有的错误.