编辑: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%的单词可以正常显示,然后它会在没有警告的情况下发生段错误。 经过更深入的检查,它以与添加顺序相反的顺序读回单词(这是有道理的),并且会在链表末尾的第五个单词(第五个添加的单词)之前崩溃。我已尝试调整插入函数以允许字符串超过40个字符,但插入到开头的单词(并造成段错误)都不到20个字符。 通过进一步挖掘,如果在printList函数中printf l2->next->next->next->next,则插入的第一个单词就在那里。 请问有谁能指导我正确的方向吗? 谢谢
strncpy
而不是strcpy
的习惯。 - thitonstrncpy
来确保不会越界内存。 - ugoren