C语言函数栈帧的创建与销毁
前言:
前期学习的时候,我们可能有很多困惑。
比如:
- 局部变量是怎么创建的?
- 为什么局部变量的值是随机值?
- 函数是怎么传参是?传参的顺序是怎样的?
- 形参和实参是什么关系?
- 函数调用是怎么做的?
- 函数调用结束后怎么返回的?
知道函数栈帧的创建和销毁后,上面的问题即迎刃而解,接下来让我们学习函数栈帧的创建和销毁吧
tip:差异性
函数栈帧由于编译器不同,可能会有一些细微的差异,但整体逻辑是一样的
esp 和 ebp 两个寄存器


每一个函数调用,都要在栈区创建一个空间,ebp是栈底指针,esp是栈顶指针
main函数被谁调用?
在VS2013中,main函数也是被其他函数调用的,调用顺序如下:

调用顺序:
因此,每次调用函数后,都会在栈区开辟一块空间,由高地址到低地址的顺序就是
mainCRTtartup -> __tmainCRTtartup -> main -> Add
局部变量如何创建?
在一个函数中开辟栈帧,并且将内容先全部变成随机值,接着这些局部变量在函数栈帧中找到一些空间进行存储,如果局部变量没有初始化,那么就会默认为刚才设置的随机值。
这也就解释了如果局部变量没有初始化,那么就是随机值!
