静态内存和动态内存有关问题
静态内存和动态内存问题# include iostreamusing namespace stdint * f(void){int ch[5] {1,2,3,4,5}
静态内存和动态内存问题
# include <iostream>
using namespace std;
int * f(void)
{
int ch[5] ={1,2,3,4,5};
return ch;
}
int main(void)
{
int * ch;
ch = f();
cout << ch[1] << endl;
return 0;
}
有点想不明白,不是说了静态变量在一个函数结束后内存就被释放掉,除非是动态分配的,但我这个函数中f函数中的数组是静态分配的,返回是一个地址,但在main函数还是可以照样使用它们的值,是不是编译器的事啊,我使用的是VC++6.0..
[解决办法]这个我也遇到过类似的问题,不是编译器的问题,也不是语法的问题。你这么些已经造成了非法内存访问了,只不过没有显现出来罢了。具体解释如下:
在函数执行过程中,数组名ch是一个合法的且正在使用的存储空间,编译器为其他的变量在栈上开辟空间的时候是不能开在这里的,在函数调用结束后变量ch会销毁,然而这个销毁是指编译器将这块内存空间置为收回状态,也就是说这块内存空间不属于哪个变量了,而是属于编译器了。但由于没有其他的变量在这里存储,所以这块空间里的值还是原来的,引用的话还是有东西的。如果后来这个引用还存在,且这块内存空间已经被编译器分配给其他的变量了,那么现在引用的就是不符合原意的,并且是非法的,更可能是危险的了(如果新的变量是不允许被改动的)
具体请看我的一篇博客:http://blog.csdn.net/zlhy_/article/details/8184919
[解决办法]内存中的东西还在
[解决办法]你承包了一亩地(申请内存),到期后(函数结束)按道理你不能再种了,可你忘了期限到了,还去地里收你的东西,运气好的话还可以收到你的东西(这块地村委会(编译器)还没有回收,分给其他人种),运气不好的话就是你种的东西已经被别人用旋耕机处理掉种他自己的东西了。