在函数调用时,系统会为以下三种数据分配内存
函数参数中的变量 |
函数内定义的普通变量(局部变量) |
调用函数时的一些地址信息(帮助返回上一级函数) |
存储这些信息的内存区域被称为栈,每个被调用的函数都有属于自己的栈,称为栈帧。
每个函数的栈(也就是上文提到的栈帧)由两个关键的寄存器定位,分别为:
%esp 用于定位当前函数的栈顶,其值向低地址增长。 |
%ebp 用于定位当前函数的栈底,其值只在函数返回或调用函数时才会发生变化。 |
过多的函数调用可能产生栈溢出。
如需获知进程栈空间的最大容量,可以输入 ulimit -s 命令。
ulimit -s
我们也可以从 %esp 寄存器验证这一点。
编写如下代码并编译。
void main(){
main();
}
使用GDB进行调试。
开始时的%esp 的值是 0xffffde80,发生错误时的%esp 的值是 0xff7ff000。可以看出栈空间是从高地址向低地址生长的。
通过上述计算,验证了栈空间的最大容量。