[英]Segmentation fault in linked list
編輯: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個字符串的字符串,但是在開頭插入的字(並且是segfaulted)都在20個字符以下。
如果我在printList函數中printf l2-> next-> next-> next-> next,那么插入的第一個單詞就在那里。
有人可能會指出我正確的方向嗎?
謝謝
gdb(或另一個調試器,如果你不使用linux)是我追蹤段錯誤的首選工具。 使用調試符號編譯代碼並在調試器中運行它。 當您崩潰時,檢查導致崩潰的線路。 根據需要使用backtrace命令。 按照這些步驟,我總是告訴我如何修復段錯誤。
我最好的猜測是strncpy而不是strcpy會解決你的問題,聽起來有些東西在列表的后面某處覆蓋了你的'下一個'指針,而'in'中的字符串太長了肯定會這樣做。
不要忘記strncpy不會終止太長的字符串,所以要確保放置
x[39]=0;
確保字符串正確終止。
你是如何初始化你的第一個節點的?
你說“前幾個字導致了seg故障”,但是中斷可能會阻止他們打印,問題實際上是在最后。
我的假設(實際上只是猜測:P)是你的第一個節點沒有next = NULL;
,它只是未初始化的記憶。 因此,while循環不會檢測到它到達列表的末尾並嘗試打印奇怪的東西,從而導致段錯誤。
這是一種風格的評論(SO人們不會理解; - [)普通for循環有什么問題? 當為這種事物存在有效的慣用結構時,為什么要在循環內部進行迭代?
void printList(List *lp)
{
List *l2;
for(l2=lp; l2; l2 = l2->next)
{
printf("%s ", l2->x);
}
return;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.