C中free()的精确输出?
我想问,如果我有一个指向某个结构的指针,但是我释放了(结构),那么如果我取消引用指针,它会指向NULL吗?我可以检查一下吗,指针!=NULL,或者这是未定义的C中free()的精确输出?,c,pointers,free,null-pointer,C,Pointers,Free,Null Pointer,我想问,如果我有一个指向某个结构的指针,但是我释放了(结构),那么如果我取消引用指针,它会指向NULL吗?我可以检查一下吗,指针!=NULL,或者这是未定义的 谢谢 它没有定义。C没有定义它对指针的内容做了什么,尽管大多数实现什么都不做。对指针调用free()不会更改指针值。它仍然指向不再属于应用程序的同一内存。您应该总是在释放指针后立即为其分配NULL,以确保不再使用它 void *p = malloc(10); // p points to allocated memory free(
谢谢 它没有定义。C没有定义它对指针的内容做了什么,尽管大多数实现什么都不做。对指针调用free()不会更改指针值。它仍然指向不再属于应用程序的同一内存。您应该总是在释放指针后立即为其分配NULL,以确保不再使用它
void *p = malloc(10); // p points to allocated memory
free(p); // p still points to invalid memory
p = NULL; // good practice
请看第页
它清楚地说:
请注意,此函数保持ptr的值不变,因此
仍然指向相同的(现在无效)位置,而不是null
指针
请注意,由您来确保指针在释放后没有被解除引用。请考虑下面的代码
int main()
{
int *p = (int *)malloc(sizeof(int) * 10);
free(p);
}
这里变量p是函数main
的局部变量。此变量的大小为4字节(32位m/c)或8字节(64位m/c)。现在我们分配内存来存储10个整数元素,该地址存储在变量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;
要明确的是,指针本身不会改变。这里没有解释执行情况的余地。指向的数据可能保持不变,或被覆盖,或以其他方式变得不可访问,这可能就是您的意思。如果没有指向某个变量的指针,您很难更改该变量值的内容。因此,要将原始指针设置为NULL,需要一个指向指针的指针,然后取消对该指针的引用,
释放内存并将指针的值设置为NULL。但是当free()
被传递一个普通指针时。。。它只会看到原始指针值的“副本”。宏需要工作-谷歌搜索“吞咽分号”以获得更安全可用的习惯用法。