变量分配顺序

时间:2014-09-18 15:30:58

标签: c memory

如果我有:

int c = 100; 
float g = 22f;

当我调试代码时,分配这些变量的地址是相反的 订单与我写的顺序相比。

所以,即c在地址0x0086f910分配,g在地址0x0086f904分配。

gc之前分配,但在我c之前编写g的代码中!

例如,对于数组元素或结构成员,这种情况不会发生,其中元素/成员的分配顺序与我放置的顺序相同。

为什么?

2 个答案:

答案 0 :(得分:3)

允许编译器通过存储变量执行任何操作。规范中没有任何内容可以保证此行为的任何内容。不要在你的程序中依赖它。

相比之下,结构中字段的顺序和数组中元素的顺序是规范。

答案 1 :(得分:3)

C没有谈论如何分配局部变量,在何处或以何种顺序分配局部变量;这些是实施细节。从语言的角度来看,这个问题没有实际意义。实现可以以完全随机的方式进行分配,使得它根本无法与任何东西相关联,并且仍然符合ISO C标准。

对于实现,在x86上,堆栈自上而下增长,即较新的堆栈帧,变量等从较高的存储器地址分配给较低的存储器地址。这是一个惯例,人们可以忽略它并为x86编写一个编译器,这可能会使堆栈向相反方向增长。

由堆叠器Where the top of the stack is on x86阅读Eli Bendersky,了解有关此内容的详细信息;它确切地解决了你的困惑(尽管从实施的角度来看)。