C++が配列を返す際の注意点

819 ワード

今日は配列を返す問題に遭遇して、ネットで探してみると、多くの人が方法をお勧めしていることがわかりました.
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;
}