C中free()的精确输出?

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(

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


谢谢

它没有定义。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()
被传递一个普通指针时。。。它只会看到原始指针值的“副本”。宏需要工作-谷歌搜索“吞咽分号”以获得更安全可用的习惯用法。