2013-11-25 81 views
0

我有一个功能,在功能上,我有两个变量相同的模式,变量内存地址

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 

现在,我们从第e输出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

强制没有优化也许? '#pragma OPTIMIZE OFF' – Leonardo

+0

@Leonardo:一个非常糟糕的想法。即使它在这种情况下起作用,也是非常具有误导性的,因为该语言不能保证编译器分配自动变量的位置。 –

回答

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++还对物体的构造和破坏顺序做出保证。 (当它们按照外观顺序进入范围时构建,当它们离开范围时以相反的顺序被破坏)。但是,我不会深入研究这一点,因为这超出了你的问题。

+0

这个变量在函数中。 –

+0

函数的局部变量是自动变量。它们通常(但不总是)分配在堆栈上。语言唯一的保证是当它们进入范围时自动为你分配它们,并在你超出范围时自动删除它们。 –

+0

根据你的变量名判断,你不会碰巧正在写缓冲区溢出,对吗? ;-) –