C中程序的内存分配和函数调用时栈帧的创建

一个C/C++程序占用内存可以分为以下几部分:
1.栈区(stack)------------------------   由编译器自动分配释放,存放了为运行函数而分配的局部变量,函数的参数,返回数据,返回地址等。操作方式类似于数据结构中的栈。(下面函数调用就是在栈区上分析的)
2.堆区(heap)------------------------    一般由程序员分配和释放,若程序员不释放,程序结束时内容可能由OS回收,若未回收,可能产生内存泄露问题,分配方式类似于链表。
3.全局区(静态区)(static)------    存放全局变量,静态数据,常量。程序结束后由系统释放。
4.文字常量区----------------------------     常量字符串存放的位置。程序结束后由系统释放。(具有只读属性,人为修改时,会在运行时报错)
5.程序代码区----------------------------     存放函数体(类成员函数和全局函数)的二进制代码。(具有只读属性)

绘图表示如下:
C中程序的内存分配和函数调用时栈帧的创建

C中程序的内存分配和函数调用时栈帧的创建
该图结构伴随着程序开始到结束
C中程序的内存分配和函数调用时栈帧的创建

几个寄存器了解:
EBP:基址寄存器,存放了指向函数栈帧栈底的地址
ESP:栈顶寄存器,存放指向函数栈帧的栈顶的地址
EIP:保存当前执行指令的下一条指令的地址
EAX,ECX:通用寄存器,此处用来临时存放变量
命令:
Call:通过修改EIP实现函数跳转,借助jmp实现;
          且会将当前正在执行的指令的下一条指令的地址保存(压入栈中);
Ret:   弹出栈顶返回值作为地址,将程序跳转到该地址处

用简单绘图展示如下:
1.主函数栈帧的创建
C中程序的内存分配和函数调用时栈帧的创建



2.参数传递过程
C中程序的内存分配和函数调用时栈帧的创建


3.函数调用过程
C中程序的内存分配和函数调用时栈帧的创建