局部变量脱离区域后为啥依然占用内存空间

局部变量脱离区域后为什么依然占用内存空间
#include <iostream> 
using namespace std; 
void main()
{
if(!0)
{
int a;
cout<<(int)&a<<endl; //1、  ---比如为1245052
}

int b;
cout<<(int)&b<<endl;//2、---比如为1245048

int c;
cout<<(int)&c<<endl;

}
大家可以看到在1的位置为1245052,理论上说a在脱离if体后,a在栈的内存会被释放调,为什么在2的位置居然输出不是1245052而是1245048,说明a还占用着内存。。。怎么解释。。
c++

------解决方案--------------------
在编译和运行是两个概念。

编译时为对应变量分配地址,运行产生值。对不同变量不会去分配相同的地址。
------解决方案--------------------
内存是在运行前分配好的
你的程序等价于
#include <iostream> 
using namespace std; 
void main()
{
int b;
int c;
if(!0)
{
int a;
cout<<(int)&a<<endl; //1、  ---比如为1245052
}


cout<<(int)&b<<endl;//2、---比如为1245048


cout<<(int)&c<<endl;

}
------解决方案--------------------
块作用域的”释放“指在作用域外不可访问而已,栈上的空间不用释放。 
------解决方案--------------------
引用:
引用:作用域只是 C++ 在语法上的限制. 不让你访问那个名字而已.
没有人说变量是进入作用域时分配, 离开作用域释放.
实际上, 所有的局部变量和函数参数都是通过进入函数是一条加减 esp 的语句一起分配的.
那是不是说,在编译时就在栈分配好了内存地址空间,离开作用域时只是把这块地址内存空间和变量a脱离关系,a在外不可访问,但是a所占内……


是的, 函数返回再进入下一个函数的时候会重新把 a 的地址分配给其它变量之类的. 但是这个地址一直都是可用的.
------解决方案--------------------
引用:
引用:块作用域的”释放“指在作用域外不可访问而已,栈上的空间不用释放。
栈上的空间不释放,那么栈的所谓内存自动释放是个什么概念


自动释放是指随着调用栈变化,栈上的空间自行收缩或扩大,不用程序员干预。
------解决方案--------------------
引用:
引用:可是又在下面定义了很多函数,发现a以前所在内存地址上的值,一直都没有被覆盖过

要在定义 a 这个函数返回后再进入其它函数才可能覆盖掉 a 的值.
我给你个例子来说明吧:
C/C++ code?12345678910111213141516171819202122int* gPtr = NULL; void funcA……
不是这样的 你这几乎是在误导了 函数结束了 不管内存有没有回收 不管里面的值有没有被修改 都已经不能使用了 这是铁律 你的想法脆弱得不堪一击
局部变量脱离区域后为啥依然占用内存空间
------解决方案--------------------
其实电脑开机后物理内存的每个字节都是可读写的,区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。

------解决方案--------------------
引用:
其他的类似什么时候分配内存 什么时候释放内存 同一块内存什么时候分配 什么时候再分配 这样的东西 猜不到的

对于各种不同的平台, 不同的编译器, 肯定错误的, 而且是猜不到的.
但对于我正在使用的编译器, 我是可以猜到它会给我生成什么样的代码的. 而且我还可以查看它是不是生成的这样的代码.
这种用法毫无疑问是错误的, 但是用它来理解一下函数变量的实现并无不妥.