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