2012-05-23 38 views
5

的代码如下:我可以在C中释放()静态变量和自动变量吗?

#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()功能能够释放静态变量,并自动变量两者兼而有之?或者基本上它什么都不做?

+1

它对“作品”的质量定义足够低。即使在相同的系统,相同的编译器或不同的编译选项中,它也可能会崩溃。这只是**未定义的行为** - 任何事情都可能发生,甚至有可能发生。 – Jens

回答

12

上调用不被分配存储器的功能(malloccalloc等)返回一个指针free()导致未定义行为
你的代码有一个未定义的行为,所以编译器不需要给你任何诊断,它可以显示任何行为,它可能工作,或崩溃,或从字面上做任何事情。

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

+0

您也可以在NULL指针上调用free(),因为这是定义的行为。只要确保你永远不会在*相同的*指针上调用两次free()。 –

+0

如果我尝试释放两次? – caramel1995

+0

@ caramel23:你可以保证是一个未定义的行为。 –

5

你不应该那样做。 free仅用于通过malloc函数族从堆中动态分配的内存。

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

究竟发生了什么取决于free的实施。通常在堆中维护特定的数据结构以帮助追踪分配的空闲内存区域。 free预计这些数据结构位于其参数所指向的地方。当你将一个指针指向一个不指向malloc的分配堆区域时,它会将垃圾数据视为一些有用的信息并做一些奇怪的事情。如果结果只是一个直接的程序崩溃,那么你很幸运。