今天遇到了一个返回数组的问题,去网上搜了一下,发现很多人推荐使用一下方法:
int *f()
{
int a[2];
a[0]=1;
return a;
}
以上方法能编译通过,但是这是错误的。且看以下代码:
#include <stdio.h>
using namespace std;
int* f()
{
int ch[2];
ch[0]=0;
return ch;
}
void f1()
{
int ch[2];
ch[0]=1;
}
void f2()
{
double a=10.288;
}
int main()
{
int* aa=f();
cout<<aa[0]<<endl;
f1();
cout<<aa[0]<<endl;
f2();
cout<<aa[0]<<endl;
getchar();
}
输出结果:
0
1
-13377
数组ch的首地址指针是指向栈上面的一段内存,这段内存在f函数结束后,就已经被系统忽略了。那么这个空间在程序运行过程中,很有可能被重新分配值,因此aa[0]就可能变成任意的值,而不是我们所希望的那个数组了。
正确的做法是用new来分配,这样得到的数组是在堆上面分配的。当然最后空间要自己释放。
int *f()
{
int *a=new int[2];
a[0]=1;
return a;
}