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

C++ 可交换声明的变量具有相同的内存地址模式,c++,c,gdb,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\u标志的输出 $1 = (int *) 0xffffd018 现在,我们从输出中看到,auth_标志的位置是缓冲区前4个字节。现在,如果我像这样声明变量 char buffer[16]; int au

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

  int auth_flag = 0;
  char buffer[16];
现在这里是gdb命令的输出
x/s buffer

0xffffd01c: "\201\203\004\b\344\203\373\367\002"
以及
print&auth\u标志的输出

$1 = (int *) 0xffffd018
现在,我们从输出中看到,auth_标志的位置是缓冲区前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中没有反转变量的地址顺序呢。我正在读一本书,据说地址应该颠倒过来,但它不是在我的电脑里发生的。所以我真的很困惑。< < P > > P,请参阅那本书,如果它说自动变量在标准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++还保证对象的构造和销毁顺序。(当它们进入外观的范围时构造,在构造的相反顺序中被破坏,当它们离开范围时)。但是,我不会深入研究这个,因为这超出了你的问题。

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

可能不强制进行优化<代码>#pragma优化关闭
@Leonardo:一个非常糟糕的主意。即使它在这种情况下工作,也会产生很大的误导,因为这种语言无法保证编译器在何处分配自动变量<代码>#pragma优化关闭@Leonardo:一个非常糟糕的主意。即使它在这种情况下工作,也会产生很大的误导,因为语言无法保证编译器在哪里分配自动变量。这些变量在函数中。函数的局部变量是自动变量。它们通常(但不总是)在堆栈上分配。语言的唯一保证是,当它们进入作用域时,它会自动为您分配它们,当它们超出作用域时,它会自动为您删除它们。从变量名判断,您不会碰巧在练习编写缓冲区溢出,是吗?;-)那么,函数的堆栈是如何定义的呢?如果不保证自动变量被分配,那么当函数被推入堆栈时会发生什么,那么变量应该被分配到内存中。它们是按什么顺序分配的?是的,就是这样。。我正在练习缓冲区溢出:数据这个变量在函数中。函数的局部变量是自动变量。它们通常(但不总是)在堆栈上分配。语言的唯一保证是,当它们进入作用域时,它会自动为您分配它们,当它们超出作用域时,它会自动为您删除它们。从变量名判断,您不会碰巧在练习编写缓冲区溢出,是吗?;-)那么,函数的堆栈是如何定义的呢?如果不保证自动变量被分配,那么当函数被推入堆栈时会发生什么,那么变量应该被分配到内存中。它们是按什么顺序分配的?是的,就是这样。。我正在练习缓冲区溢出:D