編輯: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,插入的第一個單詞就在那裏。
任何人都可能指出我在這個正確的方向嗎?
感謝
打印清單的代碼請好嗎? – nmjohn 2012-01-12 22:27:08
首先,養成使用'strncpy'而不是'strcpy'的習慣。 – thiton 2012-01-12 22:28:33
是否超過39個字的單詞之一?你應該使用'strncpy'來確保你不會超出內存。 – ugoren 2012-01-12 22:29:19