You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

栈中Buffer会保留还是被弹出?函数退出及后续调用的栈状态咨询

栈上局部数组在函数退出后的内存处理问题

示例代码

int hello(){
 char arr[16];
 scanf("%s",arr);
 printf("%s",arr);
 return 0;
}

疑问解答

关于leave指令的执行逻辑

你对leave指令的理解是正确的:printf执行完毕后,leave指令会先将ebp的值赋值给esp,随后弹出栈顶的旧ebp值恢复ebp寄存器,此时ebp和esp都会指向函数序言阶段压入栈的旧ebp地址。

核心问题解析

  • 函数退出时,栈上的arr数组不会被主动清除,它所占用的栈空间只是被标记为可被后续操作复用,原本的数据会暂时留在栈内存中。
  • 如果在hello函数之后调用另一个函数,新函数的栈操作(比如压入函数参数、保存当前ebp、分配自身局部变量等)会覆盖hello函数栈帧所在的内存区域,其中就包括arr数组原来的位置。因此在新函数执行期间,arr数组的旧数据基本都会被覆盖,不会再保留在栈上。

内容的提问来源于stack exchange,提问作者Zishan Ansari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 18:23:15