可互换声明的变量具有相同的内存地址模式



我有一个函数,在这个函数中,我有两个变量,

  int auth_flag = 0;
  char buffer[16];

现在是gdb命令x/s buffer 的输出

0xffffd01c: "20120304b34420337336702"

print &auth_flag 的输出

$1 = (int *) 0xffffd018

现在,我们从输出中看到,auth_flag的位置是缓冲区之前的4个字节。现在,如果我声明像这样的变量

char buffer[16];
int auth_flag = 0;

先前命令的输出是

0xffffd00c: "20120304b34420337336702" and
$1 = (int *) 0xffffd008

同样的事情。落后100个字节,但顺序相同。我的问题是,由于我已经颠倒了变量声明,为什么在gcc中没有颠倒变量的地址顺序。我正在读一本书,书中说地址应该颠倒,但这并没有发生在我的电脑上。所以我真的很困惑。

如果这本书说自动变量在标准C或C++中彼此之间有任何特定的地址关系,就烧掉它。structclass中的字段具有实现定义的布局。自动变量甚至不能保证分配给内存。

现在,C++所保证的是符号定义的顺序(编译时构造,而不是内存布局问题),以及调用构造函数的顺序。例如,该顺序以精确的方式定义了以下代码的含义:

int foo(int x)
{
    int y = x;  // this sees the argument x
    int x = 3;  // this defines an automatic variable named x that shadows the argument
    return x + y;
}

C++还保证了对象的构造和销毁顺序。(当它们按外观顺序进入范围时构建,当它们离开范围时按相反的构建顺序销毁。)但是,我不会深入研究,因为这超出了你的问题。

最新更新