C语言中不同作用域的非全局局部变量为何地址与值均相同?
原因解释
- 自动变量的栈分配规则:C语言中函数内的非静态局部变量(自动变量)存储在程序的栈空间,函数调用时会在栈顶开辟当前函数的栈帧,用来存放局部变量、函数返回地址等数据;函数执行结束后,栈帧会被弹出,栈指针回退到调用前的位置,但操作系统/编译器不会主动清空栈帧对应的内存区域的旧数据。
- 栈帧复用导致地址相同:你的示例中
testA和testB的栈帧大小、布局完全一致,二者都只定义了1个int类型的局部变量,且调用的printf参数结构完全相同。testA执行完成后,它占用的栈空间被释放到栈顶,接下来调用testB时,系统直接在当前栈顶为testB分配栈帧,因此y的内存地址正好和之前x的地址重合。 - 取值相同是未定义行为的巧合:
testB中的y没有做初始化,读取未初始化自动变量的值属于C标准定义的未定义行为,这里刚好读到之前x残留的56,只是内存没有被覆盖的偶然结果,完全不具备可移植性,也不能作为可靠特性使用。只要修改函数内的局部变量定义、开启编译器优化、更换运行环境,y的取值就会变成随机脏数据,甚至可能触发程序崩溃。
内容的提问来源于stack exchange,提问作者Wassim Tahraoui
相关产品推荐
相关产品推荐

