什么时候函数的返回值是否被回收

代码港湾 论文问答 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的地址被回收了呢

回复

共2条回复 我来回复
  • 毕设货栈
    这个人很懒,什么都没有留下~
    评论

    返回局部变量的地址是未定义行为,你想想何为清理?难道要把它全部清零为止还是把它砸碎?如果有个尺寸巨大的局部变量,那么清零将耗费时间,而砸碎不存在,所以在c/c++程序,就是把这个局部变量所在的地址表示为可以用而已,具体的说局部变量在栈上,只有在栈顶以下的地址才是可以用的地址(windows里栈的增长方向是往下),所以你的数据已经在栈顶以下了但是没有被新数据覆盖,数据还在那里,你可以再访问它,但是不能保证你一定正确。

    0条评论
  • 代码客栈
    这个人很懒,什么都没有留下~
    评论

    a是个数组,你写return a,return的不是指针,而是值啊。 这有点类似你把数组当参数传递,如果不写指针而直接传数组本身,你里面修改了外面不变。

    0条评论

发表回复

登录后才能评论