过多的函数调用可能产生栈溢出

函数调用时,系统会为以下三种数据分配内存

函数参数中的变量
函数内定义的普通变量(局部变量
调用函数时的一些地址信息(帮助返回上一级函数)

存储这些信息的内存区域被称为,每个被调用的函数都有属于自己的栈,称为栈帧

每个函数的栈(也就是上文提到的栈帧)由两个关键的寄存器定位,分别为:

%esp   用于定位当前函数的栈顶,其值向低地址增长
%ebp   用于定位当前函数的栈底,其值只在函数返回或调用函数时才会发生变化。

过多的函数调用可能产生栈溢出。

如需获知进程栈空间的最大容量,可以输入 ulimit -s 命令。

ulimit -s

 

我们也可以从 %esp 寄存器验证这一点。

编写如下代码并编译。

void main(){
    main();
}

使用GDB进行调试。

 开始时的%esp 的值是 0xffffde80,发生错误时的%esp 的值是 0xff7ff000。可以看出栈空间是从高地址向低地址生长的。

 

 通过上述计算,验证了栈空间的最大容量。

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值