簡體   English   中英

鏈表中的分段錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM