其代码如下:
#include <stdlib.h>
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()
函数能够释放静态变量,并自动变量两者兼而有之? 或者基本上什么也不做?
调用free()
上不受内存分配函数(返回一个指针malloc
, calloc
等)导致未定义的行为 。
你的代码中有一个未定义行为,所以编译器不需要给你任何诊断的它,它可以表现出任何行为,它可能工作,或崩溃,或从字面上做任何事情。
只要避免引起未定义行为是唯一的解决办法写的代码。
你不应该这样做。 free
仅用于通过从堆动态分配存储器malloc
系列函数。
内存num
数据段是静态分配的,不能被释放。 内存num2
在被分配main
的调用堆栈帧,并将尽快发布作为main
的回报。
到底发生了什么取决于实现的free
。 通常有堆维持,以帮助特定数据结构malloc
/ free
跟踪分配和释放内存区域。 free
预计这些数据结构是周围的地方它的参数点的地方。 一个当你传递一个指针不指向malloc
-allocated堆区域,它会考虑垃圾数据,一些有用的信息,并做一些奇怪的事情。 而你是幸运的,如果结果仅仅是一个直接的程序崩溃。