我有一个函数,在函数中,我有两个变量,
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中反转变量的地址顺序。我正在读一本书,据说该地址应该被颠倒,但它并没有发生在我的电脑里。所以我真的很困惑。
答案 0 :(得分:4)
如果它说自动变量在标准C或C ++中具有任何特定的地址关系,那么刻录该书。 struct
或class
中的字段具有实现定义的布局。自动变量甚至不能保证分配给内存。
现在,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 ++还对对象的构造和销毁顺序提供保证。 (当它们按照外观的顺序进入范围时构建,在它们离开范围时以相反的构造顺序被破坏。)但是,我不会深入研究它,因为这超出了你的问题。