C中free()的确切输出?

时间:2012-08-08 23:44:02

标签: c pointers free null-pointer

我想问一下,如果我有一个指向某个结构的指针,但是我释放(struct)然后如果我取消引用指针,它会指向NULL吗?我可以检查,指针!= NULL或未定义?

谢谢!

4 个答案:

答案 0 :(得分:2)

在指针上调用free()不会改变指针值。它仍将指向不再属于您的应用程序的相同内存。您应该在释放后立即为free'd指针指定NULL,以确保不再使用它。

void *p = malloc(10);    // p points to allocated memory
free(p);                 // p still points to invalid memory
p = NULL;                // good practice

答案 1 :(得分:1)

考虑以下代码

int main()
{
    int *p = (int *)malloc(sizeof(int) * 10);
    free(p);
}

这里变量p是函数main的局部变量。该变量的大小为4字节(32位m / c)或8字节(64位m / c)。现在我们正在分配用于存储10个整数元素的内存,并且该地址存储在变量p中。现在我们调用自由函数,我们传递的动态内存地址存储在局部变量p中。现在,自由函数将释放内存,并且无法将NULL分配给变量p。因为我们将地址作为值传递,而不是引用指针。

我们可以为free定义一个包装函数,如下所示

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

int main()
{
    int *p = (int *)malloc(sizeof(int) * 10);
    myfree(&p);
}

或者我们也可以定义宏功能

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

答案 2 :(得分:0)

未定义。 C没有定义它对指针内容的作用,尽管大多数实现都不做任何事情。

答案 3 :(得分:-1)

查看this页面。

它清楚地说:

  

请注意,此函数使ptr的值保持不变,因此它   仍然指向相同(现在无效)的位置,而不是指向null   指针。

请注意,您可以确保在释放后不会取消引用指针。