为什么我的指针在空闲后不为空?
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()
函数接受指针的副本。 ptr
和c
都是指针,但它们是不同的变量。 这个函数输出“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=0x1
, ptr=0x1
。
当你执行ptr=NULL
,只有ptr
被更改为NULL,但是仍然是0x1 ..
你正在传递指针By值..(默认情况下C通过值传递参数)这意味着你只更新副本..不是真正的位置..因为你可能需要在C中使用指针指针
void getFree(void **ptr) { if(*ptr != NULL) { free(*ptr); *ptr = NULL; } return; }