#include <stdio.h>
void function()
{
int stackVar = 10;
printf("Stack variable = %d\n", stackVar);
}
int main(void)
{
function();
return 0;
}
function
返回时的堆栈帧会发生什么?
答案 0 :(得分:4)
这是 undefined 行为(与实现定义或未指定相反)。这意味着该程序可以自由行为,或者不以任何方式取悦。
这在 6.2.4对象的存储持续时间中详细说明:
1对象具有确定其生命周期的存储持续时间。有三个存储空间 持续时间:静态,自动和已分配。分配的存储在7.20.3中描述。
2对象的生命周期是存储期间程序执行的一部分 保证为它保留。存在对象,具有常量地址并保留 它在其整个生命周期中的最后存储价值。 如果某个对象被引用到其外部 生命周期,行为未定义。指针的值在变为不确定时 它指向的对象到达其生命周期的末尾。
3一个对象,其标识符通过外部或内部链接声明,或与 存储类指定静态具有静态存储持续时间。它的一生就是整个 程序执行程序及其存储的值仅在程序之前初始化一次 启动。
4 声明标识符没有链接且没有存储类的对象 speci fi er static具有自动存储持续时间。
5对于没有可变长度数组类型的对象,其生命周期延长 从进入与之关联的块直到该块的执行结束 无论如何。(输入一个封闭的块或调用一个函数暂停,但不会结束, 执行当前块。)如果以递归方式输入块,则执行新的实例 每次都创建对象。对象的初始值是不确定的。如果 初始化是为对象指定的,每次声明都会执行 在执行该块时达成;否则,每个值都变得不确定 到达声明的时间。
答案 1 :(得分:1)
首先,你已经戏剧性地编辑了这个问题,所以其他答案(有点不公平)不再相关。仍然,回答当前的问题:
函数堆栈框架返回时会发生什么?
在我看来,您对堆栈的运行方式缺乏一般感觉。所以 - 这里有点疯狂 - 但会尝试一个可能使其“点击”的类比。您可以将堆叠框架想象成像海滩上的波浪一样。嵌套函数调用越深入,这些函数在参数和局部变量中的数据越多,使用的内存就越多。这就像波浪越过海滩。随着作用域的退出,内存被有效释放 - 内存的使用被遗忘了。波也消退了。尽管如此,在程序的整个生命周期中,当不同的功能序列进入和退出时,相同的记忆(海滩的水平)被重复使用(在水下)并被遗忘(不在水下)。最靠近海滩的位置往往被最少覆盖并且持续时间很短,而有些位于水下直到最低点退潮...类似于非递归优化的递归函数可能会占用大量内存简单地说,直接在main()
中创建的堆栈变量会一直保留到程序终止。
答案 2 :(得分:0)
答案 3 :(得分:0)
未定义的行为。 您正在从函数返回本地变量地址,因为堆栈帧被销毁(超出范围)。 现在如果没有覆盖内存(地址),那么你将获得相同的值,否则你将获得垃圾。