假设我有以下链表:
struct ListNode {
int value;
struct ListNode *next;
}
我想使用函数delete_list
释放链表list
的内存:
void delete_list(struct ListNode *list) {
while (list != NULL) {
struct ListNode *temp = list;
list = temp->next;
free(temp);
}
}
int main() {
struct ListNode *list = create_digit_list(56458);
list_print(list);
// while (list != NULL) {
// struct ListNode *temp = list;
// list = temp->next;
// free(temp);
// }
delete_list(list);
list_print(list);
return 0;
}
当我在同一作用域中释放我的列表时,我得到list
是NULL
。但是由于某种原因,当使用my函数delete_list
并传递我的list
作为参数使用free my链表时,list
不是NULL
,因此代码打印了一个无限循环的垃圾。这两种方式的区别是什么?什么是正确的方法来提取自由操作的功能?
实际上有两个名为list
的变量。一个在main函数内部,另一个是delete_list
函数的参数。为简单起见,让它们分别为list1
和list2
。
当list1
变量在main
函数中被释放时。list1
变量的最终值为NULL
。
当你将list1
变量传递给函数delete_list
时,它的值被复制到delete_list
函数作用域中的list2
变量中。当函数返回;list2
变量的最终值为NULL
。但是list1
仍然有你已经释放的结构体的原始地址。这会导致显示垃圾值。
试着重命名你的变量,这会让我更清楚。如果你愿意,你可以传递你的指针作为引用,这也会影响原始指针,并将其设置为NULL
。