1.什么是栈
栈是一种计算机系统中的数据结构,它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个弹出来),是一种特殊的线性表。栈的操作常用的有进栈(PUSH),出栈(POP),还有常用的标识栈顶和栈底。
可以把栈想象成一摞扑克牌一样,一张一张叠加起来。(如图 1的a1,a2,……,an)。
进栈(PUSH):将一个数据放入栈里叫进栈(PUSH),相当于在扑克牌的在最上面放了一张新的扑克牌。
出栈(POP):将一个数据从栈里取出叫出栈(POP),相当于在扑克牌的在最上面拿走了一张扑克牌。
栈顶:常用寄存器ESP,ESP是栈指针寄存器,其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。
栈底:常用寄存器EBP,EBP是基址指针寄存器,其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。
图 1 栈示意图
2.函数调用栈
了解了什么是栈,现在来观察栈在内存中分布情况。以Windows 32位平台为例,进程有4GB大小的虚拟地址空间,其中1GB留给系统内核,3GB是进程自身拥有。一个进程大致的内存布局如图 2所示。
图 2 进程的内存布局
代码段:存放可执行程序的代码,可读不可写。
数据段:存放程序中已经初始化的静态(全局)变量,可读写。
bss段:存放程序中未初始化的静态(全局)变量,可读写。
堆(heap):存放动态分配的内容,需