我可以在C中释放()静态和自动变量吗?

代码如下:

#include  int num = 3; // Static external variable int *ptr = # int main(void) { int num2 = 4; // Automatic variable int *ptr2 = &num2; free(ptr); //Free static variable free(ptr2); //Free automatic variable return 0; } 

我尝试编译上面的代码,它的工作原理,我很好奇free()函数是否能够释放静态变量和自动变量? 或者基本上什么也没做?

在内存分配函数( malloccalloc等)未返回的指针上调用free()会导致未定义的行为
您的代码具有未定义的行为,因此编译器不需要为您提供任何诊断,它可以显示任何行为,它可能会起作用,或崩溃,或者字面上做任何事情。

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

你不应该这样做。 free仅用于malloc系列函数从堆动态分配的malloc

num内存在数据段中静态分配,无法释放。 num2内存在main的调用堆栈帧中分配,并在main返回时立即释放。

实际发生的事情取决于free实施。 堆中通常存在特定的数据结构,以帮助malloc / free跟踪分配的和可用的内存区域。 free期望这些数据结构位于其参数指向的地方。 当你向它传递一个不指向malloc分配的堆区域的指针时,它会将垃圾数据视为一些有用的信息并做一些奇怪的事情。 如果结果只是一个立即的程序崩溃你很幸运。