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

