2013-11-24 42 views
2

所以我想利用這個函數C.刪除C中的整個鏈表,出了錯

雖然刪除整個單鏈表
void zeroList(struct node *head) 
    { 
     struct node* tempDelete; 
     struct node* current = head; 

     while(current != NULL) 
     { 
      tempDelete = current; 
      current = current->next; 
      free(tempDelete); 

     } 
    } 

我有一個問題,因爲當我嘗試驗證列表本身已被刪除(通過打印)。我留下的東西,看起來像這樣:

{ 0->146513968->146513952->146513936-> NULL } 
{ 146513920->146514048->146514032->146514016->146514000-> NULL } 
{146513984->146514064->146514080->146514096->146514112->146514128->146514144->146514160->146514176-> NULL } 

我的印象是,該節點不會依然存在,或者至少是他們會包含NULL值。任何人都可以解釋爲什麼我得到這些奇怪的垃圾數字?

+0

你準確打印什麼? – MeNa

+0

我正在打印的值在結構節點內部是ints。 –

回答

2

一旦你釋放內存,它的內容是不確定的,你不應該觸摸它們。這就是爲什麼你不應該設置一個指向你選擇的隨機值的指針的原因(操作系統需要讓你訪問它)。

你看到的值是垃圾和預期的,因爲OS不會記憶零。如果你想確保不會對內存什麼,你需要自己清除指針:

current = current->next; 
tempDelete->next = NULL; 

PS:但是,這並不能保證頭部將是NULL由函數結束。

+0

操作系統通常不會*零內存。但如果它覺得這樣做的話。一旦你不再擁有它,你真的不能相信某個特定位置的任何信息 - 即使它是垃圾,或者甚至它的價值不會像釋放內存之前存儲在那裏的合法價值一樣。 – cHao

+0

@Charles,感謝您的信息。這看起來可以完成這項工作,但是我仍然在每個列表的開頭都收到一件神器。這是因爲頭部不能保證爲NULL?我不確定在函數結束時如何明確地將頭部設置爲NULL。我試過任務,但這似乎沒有什麼區別。 –

+0

如上所述,釋放後你不應該相信內存:在調用你的函數後,你不應該觸摸head或list元素。你對free'd內存所做的任何事情都是未定義的行爲。 –