函数栈帧
函数栈帧(stack frame)就是函数调用过程中在程序的调用栈(call stack)所开辟的空间,这些空间用于存放
- 形参、返回值
- 临时变量(包括函数的非静态的局部变量以及编译器自动生产的其他临时变量)
- 保存上下文信息(包括在函数调用前后需要保持不变的寄存器)
堆
动态内存分配(malloc,free,calloc,realloc)
静态区
全局变量、静态变量
涉及函数栈帧的问题
- 局部变量的创建过程
- 局部变量不初始化导致内容随机
- 形参和实参的实例化
- 返回值的返回过程
栈
栈是一种容器,可以执行入栈(push) 出栈操作(pop),遵循先入栈的数据后出栈(First In Last Out, FIFO) 在计算机系统中,栈是一个具有上述功能的动态内存区域
函数的栈帧的创建与销毁过程
- 栈帧的创建:每一次函数调用,都要为本次函数调用开辟空间,该空间即为函数栈帧
- 栈帧维护:使用两个寄存器:esp、ebp
- ebp:栈底寄存器
- esp:栈顶寄存器

由图可见,栈总是向下增长(由高地址向低地址) 3. 内存保护机制:未被初始化的栈内存,会被写入 0XCC(CCCC-烫) 4. 传参:先将参数mov进寄存器然后push进栈帧空间,形参实质上是对实参的一份拷贝 5. 销毁栈帧:pop掉栈顶的值(栈顶此时为调用函数的栈帧),丢到寄存器中。将调用函数的ebp赋值给esp,回收调用函数的内存空间,回到调用函数前push入栈的下一条指令处,程序从寄存器中读取返回值