我想问一下,如果我有一个指向某个结构的指针,但是然后我 free(struct) 那么如果我取消引用该指针,它会指向 NULL 吗?我可以检查一下,指针!= NULL 还是未定义?
谢谢!
我想问一下,如果我有一个指向某个结构的指针,但是然后我 free(struct) 那么如果我取消引用该指针,它会指向 NULL 吗?我可以检查一下,指针!= NULL 还是未定义?
谢谢!
在指针上调用 free() 不会更改指针值。它仍将指向不再属于您的应用程序的同一内存。您应该始终在释放指针后立即将 NULL 分配给已释放的指针,以确保您不会再次使用它。
void *p = malloc(10); // p points to allocated memory
free(p); // p still points to invalid memory
p = NULL; // good practice
考虑下面的代码
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;
它是未定义的。尽管大多数实现什么都不做,但 C 没有定义它对指针内容的作用。