为什么我的指针在空闲后不为空?

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?

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

内存仍将被释放,因此您无法再安全地访问它,但您的原始指针不会为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; } 

因为getFree()函数接受指针的副本。 ptrc都是指针,但它们是不同的变量。 这个函数输出“6”的原因相同:

 void Magic(int x) { x = 1; } void main() { int a = 6; Magic(a); printf("%d", a); } 

您正在按值传递指针,因此不会被函数修改。 它只是在函数内修改的指针的副本,原始变量值不受影响。

更新:

如果您希望通过使用单行代码替换释放+归零变量来简化您的生活,则需要一个宏:

 #define MYFREE(x) free(x); x = NULL; 

或者指向指针参数的函数:

 void myfree(void** pp) { free(*pp); *pp = NULL; } 

指针在内存中的某处存储为整数。

当你做a = malloc(10);a有一些值,比如说0x1。

当你打电话给getFree(a); ,该函数将a复制到void *ptr

现在a=0x1ptr=0x1

当你执行ptr=NULL ,只有ptr被更改为NULL,但是仍然是0x1 ..

你正在传递指针By值..(默认情况下C通过值传递参数)这意味着你只更新副本..不是真正的位置..因为你可能需要在C中使用指针指针

 void getFree(void **ptr) { if(*ptr != NULL) { free(*ptr); *ptr = NULL; } return; }