【问题标题】:Location in memory for integers in c [duplicate]c中整数在内存中的位置[重复]
【发布时间】:2021-07-01 11:36:21
【问题描述】:

我想知道在 c 中是如何分配内存的。在下面的示例中,编译器似乎为程序分配了一些内存,然后返回。它是如何以及为什么会这样工作的?

代码:

int main (void) {
    int a;
    int b;
    int c, d;

    printf("a: %p\nb: %p\nc: %p\nd: %p\n", &a, &b, &c, &d);
}

输出:

a: 0x7ffff275351c
b: 0x7ffff2753518
c: 0x7ffff2753514
d: 0x7ffff2753510

【问题讨论】:

  • a 被首先压入堆栈,因此它具有最高地址。但是编译器可以随意存储这些局部变量,只要行为符合 C 标准。

标签: c memory integer location


【解决方案1】:

强烈取决于具体的实现。语言本身只规定了为不同对象分配内存的位置和方式的最少规则(请参阅C 2011 Online Draft,第 6.2.4 节,了解完整的规则集)。

在大多数实现中,auto 变量(即“本地”变量)是在堆栈上创建的。虽然实现不需要按照声明它们的顺序创建变量,但这样做并不少见。

在 x86/x86-64 上,堆栈“向下”增长为递减地址,因此压入堆栈的每个项目的地址都将低于前一个项目。

【讨论】:

    【解决方案2】:

    这取决于架构,但在许多系统上,局部变量存储在堆栈中。对于编译器而言,并不一定需要自上而下填充堆栈,因此这取决于编译器的实现。通常编译器会在堆栈上节省足够的空间并按照它认为合适的方式组织它。

    编译器甚至可能不将其放入内存中,而是可以将值直接放入寄存器中,只要可观察的行为保持不变。

    【讨论】:

      猜你喜欢
      • 2015-06-13
      • 2014-12-04
      • 1970-01-01
      • 2014-12-22
      • 1970-01-01
      • 2017-08-27
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多