函数堆栈返回时会发生什么?

时间:2013-04-18 06:35:16

标签: c stack

#include <stdio.h>

void function()
{
    int stackVar = 10;
    printf("Stack variable = %d\n", stackVar);
}

int main(void)
{
    function();
    return 0;
}

function返回时的堆栈帧会发生什么?

4 个答案:

答案 0 :(得分:4)

这是 undefined 行为(与实现定义或未指定相反)。这意味着该程序可以自由行为,或者不以任何方式取悦。

这在 6.2.4对象的存储持续时间中详细说明:

  

1对象具有确定其生命周期的存储持续时间。有三个存储空间   持续时间:静态,自动和已分配。分配的存储在7.20.3中描述。

     

2对象的生命周期是存储期间程序执行的一部分   保证为它保留。存在对象,具有常量地址并保留   它在其整个生命周期中的最后存储价值。 如果某个对象被引用到其外部   生命周期,行为未定义。指针的值在变为不确定时   它指向的对象到达其生命周期的末尾。

     

3一个对象,其标识符通过外部或内部链接声明,或与   存储类指定静态具有静态存储持续时间。它的一生就是整个   程序执行程序及其存储的值仅在程序之前初始化一次   启动。

     

4 声明标识符没有链接且没有存储类的对象   speci fi er static具有自动存储持续时间。

     

5对于没有可变长度数组类型的对象,其生命周期延长   从进入与之关联的块直到该块的执行结束   无论如何。(输入一个封闭的块或调用一个函数暂停,但不会结束,   执行当前块。)如果以递归方式输入块,则执行新的实例   每次都创建对象。对象的初始值是不确定的。如果   初始化是为对象指定的,每次声明都会执行   在执行该块时达成;否则,每个值都变得不确定   到达声明的时间。

答案 1 :(得分:1)

首先,你已经戏剧性地编辑了这个问题,所以其他答案(有点不公平)不再相关。仍然,回答当前的问题:

  

函数堆栈框架返回时会发生什么?

在我看来,您对堆栈的运行方式缺乏一般感觉。所以 - 这里有点疯狂 - 但会尝试一个可能使其“点击”的类比。您可以将堆叠框架想象成像海滩上的波浪一样。嵌套函数调用越深入,这些函数在参数和局部变量中的数据越多,使用的内存就越多。这就像波浪越过海滩。随着作用域的退出,内存被有效释放 - 内存的使用被遗忘了。波也消退了。尽管如此,在程序的整个生命周期中,当不同的功能序列进入和退出时,相同的记忆(海滩的水平)被重复使用(在水下)并被遗忘(不在水下)。最靠近海滩的位置往往被最少覆盖并且持续时间很短,而有些位于水下直到最低点退潮...类似于非递归优化的递归函数可能会占用大量内存简单地说,直接在main()中创建的堆栈变量会一直保留到程序终止。

答案 2 :(得分:0)

您正在调用未定义的行为 当你从函数返回时,堆栈框架被破坏(超出范围),你可能会收到你在函数中留下的值,但这可能是巧合。

有关示例,请参阅Wikipedia;有关文章,请参阅here

答案 3 :(得分:0)

未定义的行为。 您正在从函数返回本地变量地址,因为堆栈帧被销毁(超出范围)。 现在如果没有覆盖内存(地址),那么你将获得相同的值,否则你将获得垃圾。