gpt4 book ai didi

c - 应用 free() 后节点的值?

转载 作者:太空宇宙 更新时间:2023-11-04 05:20:06 25 4
gpt4 key购买 nike

我试图编写一个简单的函数来释放动态分配的内存

typedef struct list{
int data;
struct list * link;
} list;

list * head = NULL;
void release(list * head_new){
list * dummy = NULL;
while(head_new != NULL){
dummy = head_new->link;
printf("before freeing %p, %d", head_new->link, head_new->data);
free(head_new);
printf("free returns %p, %d", head_new->link, head_new->data);
head_new = dummy
}
}

使用 main 函数将值赋予列表,在这个特定函数中,即使在释放 head_new 节点后,也会打印一些值

1
12
1
123
1 12 1 123 before freeing 00622A40, 1
free returns 006200C4, 6433408
before freeing 00622A60, 12
free returns 006200C4, 6434048
before freeing 00622A70, 1
free returns 006200C4, 6433344
before freeing 00000000, 123
free returns 00000000, 123

如果您注意到.. 最后两行返回相同的数据值..即使我用更大的列表尝试过这个。同样的事情发生了!最后 2,3 个值(即 head_new->data)按原样返回。 我的问题:这是一种错误吗?或者有这样的值(value)观是正常的? 这个东西我比较关心,既然没有free的返回类型,那么怎么显示一样的值呢? 请帮助我清除我的疑问。

最佳答案

free(head_new);
printf("free returns %p, %d", head_new->link, head_new->data);

导致您的程序具有未定义的行为(UB)。请注意,一旦您调用 free 指针,任何取消引用指针 head_new 的尝试都会导致未定义的行为。
UB 意味着您的程序可以显示任何行为,而不必产生崩溃。简单地说取消引用它是无效的,不应该这样做。

What possibly happens behind the scenes?

free 不会重新初始化释放的内存,它只是将其标记为空闲以供重新使用。
因此地址处的内容仍然相同,并且对指针进行引用会为您提供这些内容。但是,这并不重要,因为 UB 发生在您取消引用指针的那一刻。

关于c - 应用 free() 后节点的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14495702/

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