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;
}
如果您想将原始指针置空(null),则需要传递一个指向指针的指针。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);
}
您正在通过值传递指针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,但是 a
仍然是 0x1。您正在按值传递指针..(默认情况下,C通过值传递参数),这意味着您仅更新副本..而不是真实位置..为此,您可能需要在C中使用指向指针的指针
void getFree(void **ptr)
{
if(*ptr != NULL)
{
free(*ptr);
*ptr = NULL;
}
return;
}
free
。 - undur_gongor
free
函数时,其前面的条件判断是不必要的。直接调用free(0)
也完全没有问题。 - Kerrek SB