C – free()之后会发生什么?

我有这个结构类型,我malloc为,并在我释放后,指针仍然指向我分配的数据。 这只是因为指针指向可以释放但尚未重新分配的内存吗?

#include  typedef struct Katze { int value; } Katze; int main () { Katze *mew = malloc(sizeof(Katze)); mew->value = 8910; free(mew); printf("mew: %i\n", mew->value); // why does this still say "mew: 8910"? } 

释放的记忆不再属于你了。 但这并不意味着它会以任何方式消失或改变。 为什么你的程序会烦恼? 这将浪费时间。 它可能只是将内存标记为可供后续malloc()使用,就是这样。 或者它可能不会。 使用不属于您的内存可能会执行任何操作:返回错误的值,崩溃,返回正确的值或运行飞行模拟器游戏。 这不是你的; 不要搞乱它,你永远不必担心它会做什么。

free()只是向语言实现或操作系统声明不再需要内存。 当它被写入时未定义行为。

C标准定义了free函数的行为:

free函数导致ptr指向的空间被释放,即可用于进一步分配。

这意味着稍后调用malloc (或其他东西)可能会重用相同的内存空间。

只要指针传递给free() ,它指向的对象就会到达其生命周期的末尾。 任何引用指向对象的尝试都有未定义的行为(即,您不再允许取消引用指针)。

更重要的是,指针本身的值变得不确定 ,因此任何引用指针值的尝试都有未定义的行为。 参考: N1570 6.2.4p2:

如果在其生命周期之外引用对象,则行为未定义。 当指针指向(或刚刚过去)的对象到达其生命周期的末尾时,指针的值变得不确定。

确实free()的参数是通过值传递的(就像所有的C函数参数一样),因此free实际上不能修改指针。 想到它的一种方法是指针在调用之前和之后具有“相同”值,但该值在调用之前有效并且在调用之后不确定。

尝试引用指针值,甚至取消引用它,可能 “起作用”。 这是未定义行为的许多可能症状之一(可以说是最糟糕的,因为它使得难以检测和诊断错误)。