0

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

谢谢!

4

4 回答 4

2

在指针上调用 free() 不会更改指针值。它仍将指向不再属于您的应用程序的同一内存。您应该始终在释放指针后立即将 NULL 分配给已释放的指针,以确保您不会再次使用它。

void *p = malloc(10);    // p points to allocated memory
free(p);                 // p still points to invalid memory
p = NULL;                // good practice
于 2012-08-08T23:49:48.833 回答
1

考虑下面的代码

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

这里变量 p 是函数的局部变量main。此变量的大小将为 4 字节(在 32 位 m/c 中)或 8 字节(在 64 位 m/c 中)。现在我们正在分配内存来存储 10 个整数元素,并且该地址存储在 variable 中p。现在我们正在调用 free 函数,我们将动态内存地址传递给该函数,该地址存储在局部变量p中。现在 free 函数将释放内存,它将无法分配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; 
于 2012-08-09T02:07:34.350 回答
0

它是未定义的。尽管大多数实现什么都不做,但 C 没有定义它对指针内容的作用。

于 2012-08-08T23:48:48.340 回答
-1

看看这个页面。

它清楚地说:

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

请注意,您需要确保指针在被释放后不被取消引用。

于 2012-08-09T00:01:35.343 回答