行动中的栈
因为参数和局部变量基本上属于一个功能,我们只需要考虑我们调用一个函数时,堆栈发生了什么。下面的步骤序列发生在调用函数时:
超越函数调用指令的地址推送到堆栈。这是怎样的CPU记住去后,函数返回。
房间是在函数的返回类型的堆栈。这只是一个占位符,现在。
该CPU跳转到该函数的代码。
的栈顶指针是在一个特殊的举行,称为堆栈帧。一切都添加到堆栈之后这一点被认为是“本地”的功能。
所有的函数参数都放在栈。
这个函数的内部指令开始执行。
局部变量推到堆栈上为它们定义。
当函数结束,以下步骤发生:
函数的返回值复制到占位符,被用于此目的的堆栈。
后弹出堆栈帧指针是一切。这破坏了所有的局部变量和参数。
返回值是弹出堆栈和分配作为函数值。如果该函数的值未分配到任何东西,没有分配发生,而失去价值。
要执行的下一条指令的地址是从堆栈中弹出,并继续执行,CPU的指令。
通常情况下,它是不知道如何调用堆栈的作品的重要的细节。然而,理解功能有效地在堆栈上时,他们被称为弹出当他们返回给你需要理解递归的基本原理,以及一些其他的概念是有用的调试时。
堆栈溢出
堆栈的大小有限制,因此只能容纳有限的信息。如果程序试图把太多的信息会导致堆栈,堆栈溢出。堆栈溢出发生在堆栈中的所有内存被分配-在这种情况下,进一步分配开始泛滥到存储器的其它部分。
堆栈溢出通常是分配太多变量在堆栈上的结果,和/或使太多的嵌套的函数调用(在函数调用函数调用函数调用函数D B C等)的堆栈溢出通常会导致程序崩溃。
下面是一个示例程序,导致堆栈溢出。你可以在你的系统崩溃,看它:
1
2
3
4
5
int main()
{
int nStack[100000000];
return 0;
}