gpt4 book ai didi

c - 为什么我的指针在释放后不为空?

转载 作者:太空狗 更新时间:2023-10-29 16:50:35 25 4
gpt4 key购买 nike

void getFree(void *ptr)
{
if(ptr != NULL)
{
free(ptr);
ptr = NULL;
}
return;
}
int main()
{
char *a;
a=malloc(10);
getFree(a);
if(a==NULL)
printf("it is null");
else
printf("not null");
}

为什么这个程序的输出不是NULL?

最佳答案

因为指针被按值复制到您的函数中。您正在将 NULL 分配给变量 (ptr) 的本地副本。这不会将其分配给原始副本。

内存仍然会被释放,所以你不能再安全地访问它,但你原来的指针不会是NULL

这与将 int 传递给函数相同。您不会期望原始 int 被该函数编辑,除非您将指针传递给它。

void setInt(int someValue) {
someValue = 5;
}

int main() {
int someOtherValue = 7;
setInt(someOtherValue);
printf("%i\n", someOtherValue); // You'd expect this to print 7, not 5...
return 0;
}

如果你想使原始指针为空,你必须传递一个指针到指针:

void getFree(void** ptr) {
/* Note we are dereferencing the outer pointer,
so we're directly editing the original pointer */

if (*ptr != NULL) {
/* The C standard guarantees that free() safely handles NULL,
but I'm leaving the NULL check to make the example more clear.
Remove the "if" check above, in your own code */
free(*ptr);
*ptr = NULL;
}

return;
}

int main() {
char *a;
a = malloc(10);

getFree(&a); /* Pass a pointer-to-pointer */

if (a == NULL) {
printf("it is null");
} else {
printf("not null");
}

return 0;
}

关于c - 为什么我的指针在释放后不为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7608714/

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