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?
答案 0 :(得分:21)
因为指针被按值复制到您的函数中。您正在将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;
}
答案 1 :(得分:7)
因为getFree()
函数获取指针的副本。 ptr
和c
都是指针,但它们是不同的变量。这与此函数输出“6”的原因相同:
void Magic(int x)
{
x = 1;
}
void main()
{
int a = 6;
Magic(a);
printf("%d", a);
}
答案 2 :(得分:5)
您正在按值传递指针a
,因此不会被函数修改。它只是在函数内修改的指针的副本,原始变量值不受影响。
更新
如果你想通过用一行代码替换释放变量+来使你的生活更轻松,你需要一个宏:
#define MYFREE(x) free(x); x = NULL;
或带指针参数指针的函数:
void myfree(void** pp) { free(*pp); *pp = NULL; }
答案 3 :(得分:3)
指针在内存中的某处存储为整数。
执行a = malloc(10);
时,a
有一些值,比如说0x1。
当您致电getFree(a);
时,该功能会将a
复制到void *ptr
。
现在a=0x1
和ptr=0x1
。
执行ptr=NULL
时,只有ptr
更改为NULL,但a
仍为0x1 ..
答案 4 :(得分:1)
您正在传递指针By值..(默认情况下C按值传递参数)这意味着您只更新副本..不是真实位置...因为您可能需要在C中使用指针指针
void getFree(void **ptr)
{
if(*ptr != NULL)
{
free(*ptr);
*ptr = NULL;
}
return;
}
答案 5 :(得分:1)
该问题已经回答,但是如果有帮助,我可以通过图形方式进行解释。
You are doing this->指针按值复制到函数中,因此它指向数组
but instead you want this->指向原始指针
正如Merlyn Morgan-Graham所说,解决问题的方法是添加运算符*和&。