【问题标题】:Order of allocation of variables [duplicate]变量分配顺序[重复]
【发布时间】:2014-11-13 00:55:29
【问题描述】:

如果我有:

int c = 100; 
float g = 22f;

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

因此,即c 分配在地址0x0086f910g 分配在地址0x0086f904

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

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

为什么?

【问题讨论】:

  • 你想要达到的目标真的很重要吗?
  • @true,我的问题只针对教育方面:)

标签: c memory


【解决方案1】:

C 没有讨论局部变量的分配方式、位置或顺序。这些是实施细节。从语言的角度来看,这个问题没有实际意义。实现可以以完全随机的方式进行分配,根本无法将其与任何事物相关联,并且仍然符合 ISO C 标准。

至于实现,在 x86 上,堆栈自上而下增长,即更新的堆栈帧、变量等从较高的内存地址分配到较低的内存地址。这又是一个约定,可以忽略它并为 x86 编写一个编译器,这会使堆栈向相反的方向增长。

阅读Where the top of the stack is on x86,由一位堆垛机Eli Bendersky 提供,了解更多详情;它完全解决了您的困惑(尽管从实现的角度来看)。

【讨论】:

  • C语言也一样吗?
  • @xdevel2000,不,C 不一样。C 没有构造函数和析构函数的概念,所以这个答案在这种情况下毫无意义。
  • 就像 Carl 所说的,我坚持认为,该语言在这里没有发挥作用,即两种语言规范都没有在内存地址前面强制任何内容。因此这个问题是无效的。 C++讲的是局部变量的构造和解构顺序,与你的实际问题无关。
  • @CarlNorum 抱歉,太仓促了,为了清楚起见,改写了答案。
【解决方案2】:

允许编译器对变量的存储做任何事情。规范中没有任何内容可以保证这种行为。不要在你的程序中依赖它。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-01
    • 2016-06-12
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    相关资源
    最近更新 更多