如果我有:
int c = 100;
float g = 22f;
当我调试代码时,分配这些变量的地址是相反的 订单与我写的顺序相比。
所以,即c
在地址0x0086f910
分配,g
在地址0x0086f904
分配。
g
在c
之前分配,但在我c
之前编写g
的代码中!
例如,对于数组元素或结构成员,这种情况不会发生,其中元素/成员的分配顺序与我放置的顺序相同。
为什么?
答案 0 :(得分:3)
允许编译器通过存储变量执行任何操作。规范中没有任何内容可以保证此行为的任何内容。不要在你的程序中依赖它。
相比之下,结构中字段的顺序和数组中元素的顺序是规范。
答案 1 :(得分:3)
C没有谈论如何分配局部变量,在何处或以何种顺序分配局部变量;这些是实施细节。从语言的角度来看,这个问题没有实际意义。实现可以以完全随机的方式进行分配,使得它根本无法与任何东西相关联,并且仍然符合ISO C标准。
对于实现,在x86上,堆栈自上而下增长,即较新的堆栈帧,变量等从较高的存储器地址分配给较低的存储器地址。这是一个惯例,人们可以忽略它并为x86编写一个编译器,这可能会使堆栈向相反方向增长。
由堆叠器Where the top of the stack is on x86阅读Eli Bendersky,了解有关此内容的详细信息;它确切地解决了你的困惑(尽管从实施的角度来看)。