c ++中的内存分配顺序

时间:2011-01-25 11:08:30

标签: c++ memory pointers

我编写了以下代码,试图解决一个请求类似数组的结构而不使用它们的挑战:

#include <iostream>

int main(){
    int x = 132,y = 33,z = 87;

    int *i = &x;

    std::cout << x << " " << y << " " << z << "\n";
    std::cout << &x << " " << &y << " " << &z << "\n";
    std::cout << i << " " << i-1 << " " << i-2 << "\n";
    std::cout << *i << " " << *(i-1) << " " << *(i-2) << "\n";   
}

我发现2个变量的地址(&amp; y-&amp; x)之间的差异为-1,我随后调整了代码 我不明白为什么最后定义的变量是“之前”(意思是前一个地址)。

老实说,我会认为&amp; y-&amp; x = 1。

你可以给我一些指示吗? (没有双关语:P) 哦,我知道代码是不好的做法 - 但它有缺点或例外吗?

提前谢谢

3 个答案:

答案 0 :(得分:7)

这种做法和它一样糟糕。

未指定堆栈布局;即使变量实际上有一个堆栈表示(它可能没有,如果你不接受变量地址,优化器将它移动到寄存器),变量和填充之间的顺序(即指针之间的差异)未指定。

你可以得到一个指向局部变量的指针,但你不能在它上面做指针算术 - 你得到未定义的行为(当然,除非我们讨论的是本地数组变量)。

最后,至少有一个平台,其中abs(&amp; y - &amp; x)永远不会为1(因为堆栈变量是16b对齐的)。

答案 1 :(得分:3)

因为堆栈在您的计算机上向下增长。英特尔x86有一些有用的图表,大约有一半是this page

答案 2 :(得分:1)

编译器可以将变量放在任何地方。在许多当前的操作系统中,堆栈向下增长,因此如果编译器天真地按堆栈顺序分配变量,则稍后在较低内存位置声明的变量。但同样,这完全是武断的。