2012-03-07 62 views
1

由於某種原因,多次調用函數'delAll'會導致Valgrind發出無效的錯誤。我不明白爲什麼,如果我調用該函數的第二次會導致程序進入while循環一次,即使它只是「全刪除」節點無效Valgrind

// p是調用

鏈表
struct node{ 
char *str, int data, struct node *next; 
} 

//這是我遇到的麻煩的功能:

void delAll() 
{ 

struct node *temp,*temp2; 
temp=p; 
while(temp!=NULL) 
{ 

    temp2=temp; 
    temp= temp->next; 

    free(temp2->str); 
    free(temp2); 

} 

} 
+0

free不會將值設置爲null;除了'free(temp2)'你想添加'temp2 = NULL'外。 – 2012-03-07 20:23:07

+0

o你說得對,謝謝! – user308553 2012-03-07 20:31:23

回答

1

p是指針到您的列表,而現在它將仍然是全刪除通話指向(free'd)開始後,的名單。我只是做;

p=NULL; 

...在您的while循環之後將p設置爲null(即清單已正確清除)。這將阻止你的delAll嘗試再次釋放所有元素。

當然,這將取決於p不只是一個臨時變量,我假設它是真正的「列表的開始」指針。