读书人

关于局部变量为数组时的有关问题

发布时间: 2013-10-13 14:03:53 作者: rapoo

关于局部变量为数组时的问题!
今天看到个程序


#include<iostream>
using namespace std;
int* test();

int main()
{
int *p;
p=test();
for(int i=0;i<10;i++)
cout<<*(p+i)<<endl;
return 0;
}

int* test()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
return a;
}

程序输出错误,是因为a[10]是局部变量,当函数调用结束之后便释放掉了。
但是当把代码段

for(int i=0;i<10;i++)
cout<<*(p+i)<<endl;

改为:

cout<<*(p+8)<<endl;

变成单独输出一个数,却又可以得到正确的答案,这是为什么呢?不是a[10]已经被释放掉了么?函数返回来的仅仅是个地址而言,里面所对应的的a[10]应该已经没了,为什么单独输出的时候还可以得到正确的数字呢?百思不得其解,求解惑 局部变量 c++/c
[解决办法]
可能内存数据没有擦除的!
[解决办法]
内存释放只是表明这段内存变成可用状态 里面数据不一定会被清除 我的理解是 当程序执行for(int i=0;i<10;i++)这条语句的时候会用到这段被释放的内存 所以数据被覆盖掉了 直接输出*(p+8)则不会
[解决办法]
其实电脑开机后物理内存的每个字节都是可读写的,区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。

[解决办法]
子函数里的数组其实是在其被调用后发生压栈然后按顺序往下排的10个内存单元,由SP来寻址,在子函数退出以后,那10个内存单元其实还是12345678910,只不过退出后发生了出栈,SP值以改变,程序已无法再正确找到这些值,所以称之为“释放”,但物理上那些单元里的值还是没变。当你退出子函数后直接用指针来打印得到的应该就是这些值,但是,如果你插入了某些语句,比如for,或者当中再调用一次其他的子函数,那么压栈出栈就会重新发生,这些地方的值就会被冲掉,再次打印就会是一些莫名其妙的值了

读书人网 >C++

热点推荐