首页 > 解决方案 > 为什么 &second_variable 的地址比 &first_variable 高?

问题描述

我有以下代码

int main(int argc, char *argv[]) {
    int value1 = 10;
    int value2 = 11;

    return 0;
}

当我调试代码时,&value2 高于 &value1。这意味着 value2 首先被压入堆栈,然后是 value1。

这是 gcc 的正常行为吗?

为什么 gcc 自下而上编译变量?

clang 是否也有同样的行为?

谢谢

标签: cgccstack

解决方案


堆栈上局部变量的顺序完全依赖于实现,不需要看起来一致。

当用 gcc 4.8.5 编译上面的代码并运行它时,它value1的地址比value2你看到的要高。

我也尝试在 gdb 中运行它:

int main(int argc, char *argv[]) {
    int value1 = 10;
    int x = 4;
    int value2 = 11;

    printf("&1=%p, &2=%p\n", &value1, &value2);
    return 0;
}

得到了这个:

(gdb) start
Temporary breakpoint 1 at 0x40053c: file x1.c, line 6.
Starting program: /home/dbush/./x1 

Temporary breakpoint 1, main (argc=1, argv=0x7fffffffe008) at x1.c:6
6       int value1 = 10;
Missing separate debuginfos, use: debuginfo-install glibc-2.17-196.el7.x86_64
(gdb) step
7       int x = 4;
(gdb) 
8       int value2 = 11;
(gdb) 
10      printf("&1=%p, &2=%p\n", &value1, &value2);
(gdb) p &value1
$1 = (int *) 0x7fffffffdf18
(gdb) p &value2
$2 = (int *) 0x7fffffffdf14
(gdb) p &x
$3 = (int *) 0x7fffffffdf1c
(gdb) 

在这种情况下,地址位于x之后value1value2即使它是在它们之间定义的。

这表明您不能对堆栈中变量的顺序做出任何假设。


推荐阅读