为什么我的指针在免费后不为空?[英] Why is my pointer not null after 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?

推荐答案

因为指针将复制到您的函数.您将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;
}

其他推荐答案

因为getFree()函数拍摄指针的副本. ptr和c都是指针,但它们是不同的变量.这是此功能将输出"6"的原因"6":

void Magic(int x)
{
    x = 1;
}

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

其他推荐答案

您通过值传递指针a,因此它不会通过函数修改.它只是在函数中修改的指针副本,原始变量值不受影响.

更新:

如果通过用单行代码替换释放+ rulding refuling reaving reasing vull,则需要更轻松地让您的生活更轻松地,您需要宏:

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

或指向指针参数的函数:

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

本文地址:https://www.itbaoku.cn/post/359280.html