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

为何函数退出后栈上字符串消失?C语言栈帧实验疑问

函数返回后访问局部数组指针的行为解析
  • 栈帧是由rsp/rbp寄存器划定的临时内存区间,函数返回时只会调整这两个指针的位置,把原栈帧对应的内存标记为可被后续栈操作复用,不会主动执行清零或覆盖操作——这就是你在汇编代码中看不到对0x1fff0000a0地址写入操作的原因。
  • 当create_str返回后,0x1fff0000a0已经不属于任何活跃栈帧的范围。调用print_ptr时,CPU会重新调整rsp/rbp创建新栈帧,新栈帧的初始化操作(比如保存调用者寄存器、分配自身局部变量)很可能间接覆盖了原地址的内容,哪怕汇编代码里没有直接针对该地址的写指令。
  • 就算没被新栈帧直接覆盖,CPU缓存机制也会影响读取结果:原栈帧的数据在函数返回后会被标记为无效,CPU不会再从缓存中读取旧数据,而是直接读取内存中已经被后续操作修改的内容。
  • 这本质上属于C语言的未定义行为:C标准明确规定,访问函数返回后的局部变量指针是未定义行为,编译器无需保证该内存区域的内容保持不变,哪怕表面上没有显式的修改操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 06:36:09