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

标签 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 个字节,但顺序相同。我的问题是,因为我已经颠倒了变量声明,为什么在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++ 还保证了对象的构造和销毁顺序。 (当它们按出现顺序进入作用域时构造,当它们离开作用域时以相反的构造顺序破坏。)但是,我不会深入研究它,因为这超出了你的问题。

关于c++ - 可互换声明的变量具有相同的内存地址模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20184202/

相关文章:

c - 来自用户输入的双指数

c++ - 浮点比较

c++ - 2 deque的并集和交集(异常段错误)

c++ - 调试 C++ 程序时 GDB cv::Mat python 对象问题

c++ - 如何将字符串和数字放在多维数组中?

c++ - Alglib:在最小二乘意义上求解 A * x = b

c++ - Koenig 查找参数

c++ - 如果对象是堆栈创建的(包括继承类型),是否可能发出编译错误?

c - 按位取余运算符

c - 如何使用 gdb 调试带有核心转储的代码?