首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一个关于函数返回指针的有关问题

2012-05-01 
一个关于函数返回指针的问题今天看C++ Primer Plus,上面说再C++中函数不能返回数组(不知道C能不能),我想不

一个关于函数返回指针的问题
今天看C++ Primer Plus,上面说再C++中函数不能返回数组(不知道C能不能),我想不能返回数组,返回一个数组名指针不也一样吗。于是我写了下面一段代码:

#include "iostream"
using namespace std;

int* Fun()
{
int arr[5]={2,3,4,5,6};
return arr;
}

int main()
{

int * p=Fun();
int *m=p+5;
for(;p<m;p++)
{
//cout<<""; 如果把这一句注释掉,则输出2,1245096,4280408,4266625,1245032,除了第一个是对的,其他全不对(这是为什么?是因为Fun函数离得arr数组被释放了吗)。更为怪异的在这里:如果这一句不注释(即无论cout <<"任意字符串"),连2都取不出来了(即*p!=2),而是这样的结果:1224432,1245096,4280408,4266625,1245032,
cout<<*p<<",";
}

cout<<endl;
return 0;
}
出现上述情况是为什么?我思考不出答案,所以在这里求助大家。希望大家各抒己见,如果能给出详细因由最好不过。
小子在这里谢谢大家。


[解决办法]
返回局部变量的地址 大忌呀
[解决办法]
int* Fun()
{
static int arr[5]={2,3,4,5,6};
return arr;
}
[解决办法]
局部变量是在栈中定义的,函数返回时,就被释放,所谓释放也就是Pop掉在函数中压栈的数据,SP栈顶指针增大,cout<<"";发生函数调用,函数调用,就会产生参数压栈或局部变量申请内存操作,前面释放的数据就被覆盖掉了,cout<<*p<<",";输出的地址是已经被释放掉了,可能又被覆盖掉了的内存数据,结果当然就会输出怪异的数据了。。。
[解决办法]
你想啊~局部变量使用完后自动释放,你返回了局部变量的指针,那除了第一个元素他全自动释放了,当然会错了~
[解决办法]

C/C++ code
#include "iostream"using namespace std;int* Fun(){    int *arr= new int;    static int a[5]={2,3,4,5,6};    for(int i = 0;i < 5;i++  )        cout<<a[i]<<"---"<<&a[i]<<endl;    arr = a;    return arr;}int main(){int *p=Fun();//cout<<*p<<"---"<<p<<"---"<<p+1<<"---"<<*(p+1)<<"---"<<*(p+2)<<"---"<<*(p+3)<<"---"<<*(p+4)<<endl;cout<<p<<endl;int *m=p+4;cout<<*(m)<<"--"<<m<<endl;for(;p <= m;p=p+1){ //cout<<""; 如果把这一句注释掉,则输出2,1245096,4280408,4266625,1245032,除了第一个是对的,其他全不对(这是为什么?是因为Fun函数离得arr数组被释放了吗)。更为怪异的在这里:如果这一句不注释(即无论cout <<"任意字符串"),连2都取不出来了(即*p!=2),而是这样的结果:1224432,1245096,4280408,4266625,1245032,cout<<*p<<",";}cout<<endl;return 0;} 

热点排行