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

时间:2013-11-25 03:22:01

标签: c++ c gdb

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

  int auth_flag = 0;
  char buffer[16];

现在这里是gdb命令x/s buffer

的输出
0xffffd01c: "\201\203\004\b\344\203\373\367\002"

print &auth_flag

的输出
$1 = (int *) 0xffffd018

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

char buffer[16];
int auth_flag = 0;

以前命令的输出是

0xffffd00c: "\201\203\004\b\344\203\373\367\002" and
$1 = (int *) 0xffffd008

同样的事情。后面100个字节,但顺序相同。我的qs是,因为我已经颠倒了变量声明,为什么不在gcc中反转变量的地址顺序。我正在读一本书,据说该地址应该被颠倒,但它并没有发生在我的电脑里。所以我真的很困惑。

1 个答案:

答案 0 :(得分:4)

如果它说自动变量在标准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 ++还对对象的构造和销毁顺序提供保证。 (当它们按照外观的顺序进入范围时构建,在它们离开范围时以相反的构造顺序被破坏。)但是,我不会深入研究它,因为这超出了你的问题。