C语言栈中局部变量地址与声明顺序不符原因咨询
问题原文
我的地址检测代码如下:
#include <stdio.h> int main(){ int num1, num2, *pNum1, *pNum2; num1 = 123; num2 = 321; pNum1 = &num1; pNum2 = &num2; printf("pNum1 = %p\n", pNum1); printf("pNum2 = %p\n", pNum2); pNum2++; printf("pNum2 = %p\n", pNum2); printf("*pNum2 = %i\n", *pNum2); return 0; }
我的输出如下:
我先声明了num1,再声明了num2,按照栈的内存分配规则,num1的地址应该高于num2,但实际输出中num2的地址比num1更高。请问这是什么原因?请给予指导,谢谢。
问题解答
你对栈变量分配顺序的认知属于常见误区,具体原因如下:
- C语言标准没有对栈上局部变量的布局、分配顺序做任何强制规定,变量的存放顺序、地址高低完全由编译器自主决定,和变量的声明顺序没有必然绑定关系。
- 现代编译器会根据优化等级、内存对齐规则、安全防护机制(如栈随机化、栈溢出保护)等因素调整局部变量的存放位置,比如GCC、Clang在默认编译参数下就可能调整变量顺序,开启优化选项后调整逻辑会更复杂,甚至部分变量会被优化到寄存器中,不会在栈上分配内存。
- 就算是x86等栈向下增长的架构,也不存在“先声明的变量地址一定更高”的规则,栈的增长方向只和栈帧的整体分配逻辑有关,不约束单个局部变量的排布顺序。
另外需要注意:你的代码中pNum2++后直接解引用*pNum2属于未定义行为,此时指针指向num2之后的未知内存区域,访问该地址的结果完全不可控,可能输出随机值,也可能触发程序崩溃。
内容的提问来源于stack exchange,提问作者user14705311
相关产品推荐
相关产品推荐

