c ++中的内存分配顺序

fra*_*amp 3 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";   
}
Run Code Online (Sandbox Code Playgroud)

我发现2个变量的地址(&y-&x)之间的区别为-1,我随后调整了代码我不明白为什么最后定义的变量被分配到"之前"(意思是,前一个地址).

老实说,我会想到&y-&x = 1.

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

先感谢您

zeu*_*xcg 7

这种做法尽可能地糟糕.

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

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

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

  • +1.这不仅仅是不好的做法,而是Undefined Behavior™ (2认同)