什么时候函数的返回值是否被回收
论文问答
1
#include <iostream>
using namespace std;
int *fun1(){
int a[]={1,2,3,};
int b=5;
return a;
}
int *fun2(){
int b=5;
return &b;
}
int main(){
int *p=fun1();
int *q=fun2();
cout<<p[0]<<" "<<p[1]<<" "<<p[2]<<endl;
cout<<*q;
return 0;
}
1 2 3
4199040
函数的变量在栈上分配空间,为什么fun1()返回一个数组首地址,数组中的元素没有被回收,而fun2()返回的b的地址被回收了呢
-
返回局部变量的地址是未定义行为,你想想何为清理?难道要把它全部清零为止还是把它砸碎?如果有个尺寸巨大的局部变量,那么清零将耗费时间,而砸碎不存在,所以在c/c++程序,就是把这个局部变量所在的地址表示为可以用而已,具体的说局部变量在栈上,只有在栈顶以下的地址才是可以用的地址(windows里栈的增长方向是往下),所以你的数据已经在栈顶以下了但是没有被新数据覆盖,数据还在那里,你可以再访问它,但是不能保证你一定正确。
-
a是个数组,你写return a,return的不是指针,而是值啊。 这有点类似你把数组当参数传递,如果不写指针而直接传数组本身,你里面修改了外面不变。
发表回复