行动中的栈

本文详细介绍了函数调用过程中栈的变化,包括参数和局部变量的存储方式,以及栈溢出的原因和示例。理解这些有助于更好地进行调试并避免程序崩溃。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

行动中的栈

因为参数和局部变量基本上属于一个功能,我们只需要考虑我们调用一个函数时,堆栈发生了什么。下面的步骤序列发生在调用函数时:

超越函数调用指令的地址推送到堆栈。这是怎样的CPU记住去后,函数返回。

房间是在函数的返回类型的堆栈。这只是一个占位符,现在。

该CPU跳转到该函数的代码。

的栈顶指针是在一个特殊的举行,称为堆栈帧。一切都添加到堆栈之后这一点被认为是“本地”的功能。

所有的函数参数都放在栈。

这个函数的内部指令开始执行。

局部变量推到堆栈上为它们定义。

当函数结束,以下步骤发生:

函数的返回值复制到占位符,被用于此目的的堆栈。

后弹出堆栈帧指针是一切。这破坏了所有的局部变量和参数。

返回值是弹出堆栈和分配作为函数值。如果该函数的值未分配到任何东西,没有分配发生,而失去价值。

要执行的下一条指令的地址是从堆栈中弹出,并继续执行,CPU的指令。

通常情况下,它是不知道如何调用堆栈的作品的重要的细节。然而,理解功能有效地在堆栈上时,他们被称为弹出当他们返回给你需要理解递归的基本原理,以及一些其他的概念是有用的调试时。

堆栈溢出

堆栈的大小有限制,因此只能容纳有限的信息。如果程序试图把太多的信息会导致堆栈,堆栈溢出。堆栈溢出发生在堆栈中的所有内存被分配-在这种情况下,进一步分配开始泛滥到存储器的其它部分。

堆栈溢出通常是分配太多变量在堆栈上的结果,和/或使太多的嵌套的函数调用(在函数调用函数调用函数调用函数D B C等)的堆栈溢出通常会导致程序崩溃。

下面是一个示例程序,导致堆栈溢出。你可以在你的系统崩溃,看它:

1
2
3
4
5
int main()
{
    int nStack[100000000];
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值