我有一个函数,在函数中,我有两个变量,
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 个字节,但顺序相同。我的问题是,因为我已经颠倒了变量声明,为什么在gcc中没有颠倒变量的地址顺序。我正在读一本书,据说地址应该被颠倒,但它并没有发生在我的电脑上。所以我真的很困惑。
最佳答案
如果这本书说自动变量在标准 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++ 还保证了对象的构造和销毁顺序。 (当它们按出现顺序进入作用域时构造,当它们离开作用域时以相反的构造顺序破坏。)但是,我不会深入研究它,因为这超出了你的问题。
关于c++ - 可互换声明的变量具有相同的内存地址模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20184202/