gpt4 book ai didi

c - 释放函数中的内存与同一范围内的内存

转载 作者:行者123 更新时间:2023-12-04 08:06:47 25 4
gpt4 key购买 nike

假设我有以下链接列表:

struct ListNode {
int value;
struct ListNode *next;
}
我想释放我的链表的内存 list使用函数 delete_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;
}
当我在同一范围内释放我的列表时,我得到了 listNULL .
但是出于某种原因,在使用 my 函数 delete_list 使用免费的 my 链表时并通过我的 list作为参数, list不是 NULL结果代码打印了一个无限循环的垃圾。
这两种方式有什么区别?提取自由操作以发挥作用的正确方法是什么?

最佳答案

实际上有两个变量名为list .一个在 main 函数中,另一个是 delete_list 的参数功能。为简单起见,将它们设为 list1list2 .
list1变量在 main 内被释放功能。 list1的最终值变量是 NULL .
当您通过list1函数的变量 delete_list它的值被复制到 list2存在于 delete_list 范围内的变量功能。当函数返回时; list2 的最终值变量是 NULL .但是list1仍然具有您已经释放的结构的原始地址。这会导致显示垃圾值。
尝试重命名您的变量,这会让我更清楚。如果需要,您可以将指针作为引用传递,这也会影响原始指针并将其设置为 NULL .

关于c - 释放函数中的内存与同一范围内的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66188047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com