在 C 中,將節點定義為:
typedef struct node {
int data;
struct nod *next;
} NodeT;
釋放記憶體:
void freeLL (NodeT *list) {
NodeT *p, *temp;
p = list;
while (p != NULL) {
temp = p->next;
free (p);
p = temp;
}
}
為什么我們需要額外的變數temp?
uj5u.com熱心網友回復:
如果你要重寫沒有像這樣的輔助變數的while回圈
while (p != NULL) {
free(p);
p = p->next;
}
那么這個宣告'
p = p->next;
將呼叫未定義的行為,因為可以訪問已釋放的記憶體。
所以你需要一個變數來保存下一個節點的地址
temp = p->next;
在使用包含資料成員的節點釋放記憶體之前。
uj5u.com熱心網友回復:
例如,“a->b->c->d”是一個鏈接表。a 是第一個節點。
釋放節點“a”的記憶體后(使用指向a的變數“p”),您必須獲取b的地址才能繼續釋放左側節點。如果沒有“temp”,此時您只有節點“a”的地址,并且節點“a”的記憶體已被釋放。如果你想用p->next來獲取“b”的地址,不能確定p->next就是你要的地址,因為這里的記憶體在你釋放后沒有被保護,可能會被其他人使用程式和被改變。所以這意味著你丟失了左節點的地址。
所以你必須在釋放一個節點之前使用“temp”來保存下一個節點的地址,并且你需要當前節點的地址來釋放()。這意味著您需要兩個地址,兩個變數。
uj5u.com熱心網友回復:
如果您不想使用 tmp ,可以使用 recursion :
void freeLL(NodeT *list) {
if (list == NULL) {
return;
} else {
freeLL(list->next;
}
free(list);
}
在開始之前釋放串列的末尾。如果釋放指標指向的記憶體,則可能不會使用此記憶體:嘗試訪問此記憶體會導致未定義的行為(它可能會起作用,但更肯定會在某些時候崩潰)。在現實生活中:如果你有一個盒子(A),里面有一個盒子(B),如果你在垃圾桶里清空盒子(A),那么你不能清空盒子(B),因為你沒有更多的機會訪問它,并且它的內容不再可訪問,而是被浪費了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/468815.html
上一篇:在C中使用AVX實作矩陣運算
