c++ pointer 与指针有关的问题

int* computeSquares(int& n)
{
int arr[10];
n = 10;
for (int k = 0; k < n; k++)
arr[k] = (k+1) * (k+1);
return arr;
}

void f()
{
int junk[100];
for (int k = 0; k < 100; k++)
junk[k] = 123400000 + k;
}

int main()
{
int m;

int* ptr = computeSquares(m);
f();
for (int i = 0; i < m; i++)
cout << ptr[i]<< endl << ' ';
}

为什么这个程序不会cout 1 4 9 16 25 36 49 64 81 100
哪里出了错?

因为arr这个数组是一个局部的,仅在函数computeSquares内部有效,当这个函数结束的时候,系统会自动回收这个数组的空间,而如果这个时候还去访问的话,访问到的东西,肯定就不是自己想要的了。

可以使用动态分配内存: new
因为动态分配的内存,必须主动释放才行,系统不会自己回收。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-05-25
局部变量在栈空间中分配内存,函数返回时栈指针回退,当主调函数继续调用其它被调函数时,栈指针上移,上一次函数调用所分配的空间会被本次调用覆盖,如果此时再引用原来的局部变量就会出现不可预见的结果。
所以返回局部数组arr[10]是不对的。可以将arr[10]设为全局变量(或静态局部变量)来解决这个问题:

//int arr[10];或者全局变量
int* computeSquares(int& n)
{
static int arr[10];
n = 10;
for (int k = 0; k < n; k++)
arr[k] = (k+1) * (k+1);
return arr;
}
第2个回答  2010-05-25
因为这个你返回的指针所指向的内容 在函数调用完毕时就是一个不确定的值了,因为数组时局部的,函数调用完毕的时候会自动销毁的,虽然有个地址,但是地址所指向的内容是不对的,好好想想 ,呵呵,

希望我的回答能够帮到你。
相似回答