函数局部变量在函数退出后释放 5C

int* function(void)
{
int a[3] = {1,2,3};
return a;
}
int main()
{

int* b = function();
cout << *b;
system("pause");
return 0;

}

function()中定义的数组a[]是一个局部变量,a存储的是数组的一个副本。在function()函数结束后,a被收回,即a指向的内容变得不确定。
但是,在实际编译运行过程中,依然可以得到正确输出:1,这是为什么?

8个回答

原先的内存没有被其他程序覆盖,仍然保持原值。

原先的内存没有被其他程序覆盖,仍然保持原值。通过地址碰巧找到了。
验证如下图
图片说明

函数系统会为它分配存储空间,里面的局部变量也会分配,函数调用结束就自动释
放这些存储空间,如果a的内容还能引用,只能说这段空间还没有被别人使用,没有被覆盖。

这里有两个概念:指针变量本身;它所指向的内存区域。
函数退出后,指针变量本身(4个字节,一般在栈上)会被释放,但它所指向的内存区域不会被释放。
但是例子中指针变量被你返回了,所以说可以得到正确的输出。

如果出于某种原因不想在method里释放这块空间,可以在method()里把b的值赋给一个全局指针变量,以后再释放这个全局变量。

在方法栈中每一个函数都分配有内存区域,函数的局部变量也保存在其中,当函数使用完后系统会自动释放该函数内存

在方法体内定义的数组a是一个指针地址,对a进行了实例化,当函数返回后,指针a是被释放了的,但它所指的目标内存是没有被释放的,该目标内存的起始地址由b指向。

局部变量也会分配内存,这里还没有被覆盖

当你在创建一个栈帧时,原先的栈帧区域就会被覆盖。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问