gpt4 book ai didi

c - free 对按值传递给函数的指针有什么作用?

转载 作者:太空狗 更新时间:2023-10-29 15:10:19 29 4
gpt4 key购买 nike

众所周知,如果我们将指针按值传递给函数,它不能在函数内部被释放,如下所示:

void func(int *p)
{
free(p);
p = NULL;
}

p 持有一个(可能是有效的)地址的副本,所以 free(p) 试图释放它。但由于它是一个副本,它不能真正释放它。对 free() 的调用如何知道它不能真正释放它?

上面的代码不会产生错误。这是否意味着 free() 只是默默地失败,“以某种方式”知道作为参数传入的地址无法处理?

最佳答案

p holds a copy of a (presumably valid) address, so free(p) tries to, well, free it. But since it is a copy, it cannot really free it.

这不是真的。如果 p 是由 malloc()(或 NULL)返回的有效地址,则 free() 可以正常工作.

事实上,这是实现自定义“析构函数”函数的常见模式(在用 C 语言编写 OO 风格的代码时)。

您的意思可能是 p 在此之后不会更改为 NULL - 但这是自然的,因为您是按值传递它。如果你想free()清空指针,然后通过指针(“byref”)传递它:

void func(int **p)
{
if (p != NULL) {
free(*p);
*p = NULL;
}
}

像这样使用

int *p = someConstructor();
func(&p);
// here 'p' will actually be NULL

关于c - free 对按值传递给函数的指针有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13938204/

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