编辑:Dijkstra 的回答是解决这个问题的方法。我的列表没有初始化为 NULL
我正在处理一个链表来存储一个唯一的单词列表,当我试图遍历该列表时会出现段错误。 Gdb 给我:
Program received signal SIGSEGV,
Segmentation fault. 0x0000003a07e47ff7 in vfprintf () from /lib64/libc.so.6
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.7.el6_0.5.x86_64
列表的插入代码是:
typedef struct L { char x[40] ; int occ; struct L *next ;} List;
List *insertList( char *in, List *l )
{
List *t = calloc( 1, sizeof( List ) ) ;
strcpy(t->x, in);
t->occ = 1;
t->next = l ;
return t ;
}
void printList(List *l)
{
List *l2 = l;
while(l2)
{
printf("%s ", l2->x);
l2 = l2->next;
}
return;
}
它循环遍历单词,将它们插入到链表中,貌似没问题。当我遍历列表以显示单词(大约 4200 个单词)时,大约 98%ish 会正常显示,然后它会在没有警告的情况下出现段错误。
通过更多的检查,它以与添加它们的顺序相反的顺序读回单词(这是有道理的)并且会在段错误之前到达列表末尾的第 5 个单词(添加的第 5 个单词)。我尝试调整插入函数以允许字符串长度超过 40 个字符,但在开头插入的单词(并被段错误)都在 20 个字符以下。
进一步挖掘,如果我在 printList 函数中 printf l2->next->next->next->next,插入的第一个单词就在那里。
谁能用这个给我指出正确的方向?
谢谢
最佳答案
gdb(或其他调试器,如果您不使用 linux)是我用来跟踪段错误的首选工具。使用调试符号编译代码并在调试器中运行它。当您崩溃时,请检查导致崩溃的线路。根据需要使用 backtrace 命令。遵循这些步骤几乎总能告诉我如何修复段错误。
关于c - 链表中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8843239/