我可以免费C()的静态和自动变量?(Can I free() static and automati

2019-06-24 17:12发布

其代码如下:

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

Answer 1:

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

只要避免引起未定义行为是唯一的解决办法写的代码。



Answer 2:

你不应该这样做。 free仅用于通过从堆动态分配存储器malloc系列函数。

内存num数据段是静态分配的,不能被释放。 内存num2在被分配main的调用堆栈帧,并将尽快发布作为main的回报。

到底发生了什么取决于实现的free 。 通常有堆维持,以帮助特定数据结构malloc / free跟踪分配和释放内存区域。 free预计这些数据结构是周围的地方它的参数点的地方。 一个当你传递一个指针不指向malloc -allocated堆区域,它会考虑垃圾数据,一些有用的信息,并做一些奇怪的事情。 而你是幸运的,如果结果仅仅是一个直接的程序崩溃。



文章来源: Can I free() static and automatic variables in C?