我能否在C语言中使用free()释放静态和自动变量?

8
代码如下:
#include <stdlib.h>

int num = 3;   // Static external variable
int *ptr = &num;

int main(void)
{
 int num2 = 4;  // Automatic variable
 int *ptr2 = &num2;

 free(ptr);  //Free static variable
 free(ptr2); //Free automatic variable

 return 0; 
}

我尝试编译上述代码,它可以工作,但我很好奇free()函数是否能够释放静态变量和自动变量?还是说它基本上什么也不做?


2
它对“正常工作”的定义要求质量足够低。即使在同一系统、同一编译器或不同的编译选项下,它也可能会崩溃。这只是未定义行为--任何事情都可能发生,甚至是预期之外的事情。 - Jens
2个回答

22

调用指针未由内存分配函数(malloc,calloc等)返回的free()会导致未定义行为
您的代码存在未定义行为,因此编译器不需要对其进行任何诊断,并且它可以展示任何行为,可能正常工作、崩溃或者做出任何其他行为。

避免编写导致未定义行为的代码是唯一的解决方法。


你也可以在空指针上调用free(),因为这是定义行为。只要确保不要在相同的指针上调用两次free()即可。 - Anthony Giorgio
@caramel23:你所能得到的保证只有未定义行为。 - Alok Save

5

你不应该这样做。free只能用于由malloc函数族动态分配的堆内存。

num的内存是静态分配在数据段中的,不能被释放。num2的内存是分配在主调用栈帧中的,并且将在main返回后立即被释放。

实际发生的情况取决于free的实现。通常在堆中维护特定的数据结构以帮助malloc/free跟踪已分配和空闲的内存区域。 free期望这些数据结构在其参数指向的位置附近。当您传递一个不指向malloc分配的堆区域的指针时,它会将垃圾数据视为一些有用的信息并进行一些奇怪的操作。如果结果仅是程序立即崩溃,那么你很幸运。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接