簡體   English   中英

C結構鏈表清單分段錯誤

[英]C Structure Linked List Segmentation Fault

我正在學習C中的鏈表,我的刪除功能有問題。 在該行發生分段錯誤:

while(current1 != NULL && (current1->next->data != d))

void delete(int d)
{
    struct list * current1 = head; 
    struct list * current2;

    if (len() == 0)
    { //prtError("empty");
        exit(0);
    }
    if (head -> data == d)
    { 
        head = head -> next;
    }

    //Check if last node contains element
    while (current1->next->next != NULL)
        current1 = current1->next;
    if(current1->next->data == d)
            current1->next == NULL; 

    current1 = head; //move current1 back to front */

    while(current1 != NULL && (current1->next->data != d))
        current1 = current1 -> next; 

    current2 = current1 -> next;
    current1 -> next = current2 -> next; 
}

你確保current1上至少有一個元素和你的測試current1 != NULL所以current1->next保證可以正常工作,但它可能會返回NULL本身導致current1->next->data崩潰,因為它試圖獲取數據從下一個元素。

在這一行你不知道current1->next是否為NULL。 如果它為NULL並且您嘗試訪問current1->next->data ,則將以segmentation fault結束。

你有兩個解決方案來修復你的循環:

while(current1 != NULL && (current1->data != d))
    //                             ^^^^^^^
    current1 = current1 -> next; 

要么

if ( current1 != NULL )
    while (current1->next != NULL && (current1->next->data != d))
        //         ^^^^^^
        current1 = current1 -> next; 

但在第二種情況下,你必須確保在第一個循環current1 != NULL

回答評論:

這是同樣的錯誤,你不知道current1是否為NULL並且你試圖訪問next元素,你有兩件事要做:

  • 首先,您必須確保current1在嘗試到達next之前不是NULL
  • 在你必須確定current2也不是NULL

你有兩個可能的(容易做到):

if ( NULL != current1 )
{
    current2 = current1->next;

    if ( NULL != current2 )
        current1->next = current2->next;
}

要么

if ( NULL != current1 && NULL != current1->next )
{
    current2 = current1->next;
    current1->next = current2->next;
}

兩者都運作良好。 選擇你喜歡的。

在你告訴我們有錯誤的行中,你永遠不會檢查current1->next是否為NULL 在程序的某個時刻, current1->next NULL ,因此您嘗試取消引用地址0 此時,代碼等效於((struct list *)0)->data 因此分割錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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