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

时间:2011-09-30 09:54:42

标签: c free

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?

6 个答案:

答案 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()函数获取指针的副本。 ptrc都是指针,但它们是不同的变量。这与此函数输出“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=0x1ptr=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所说,解决问题的方法是添加运算符*和&。