我编写了以下代码,试图解决一个请求类似数组的结构而不使用它们的挑战:
#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) 哦,我知道代码是不好的做法 - 但它有缺点或例外吗?提前谢谢
答案 0 :(得分:7)
这种做法和它一样糟糕。
未指定堆栈布局;即使变量实际上有一个堆栈表示(它可能没有,如果你不接受变量地址,优化器将它移动到寄存器),变量和填充之间的顺序(即指针之间的差异)未指定。
你可以得到一个指向局部变量的指针,但你不能在它上面做指针算术 - 你得到未定义的行为(当然,除非我们讨论的是本地数组变量)。
最后,至少有一个平台,其中abs(&amp; y - &amp; x)永远不会为1(因为堆栈变量是16b对齐的)。
答案 1 :(得分:3)
因为堆栈在您的计算机上向下增长。英特尔x86有一些有用的图表,大约有一半是this page。
答案 2 :(得分:1)
编译器可以将变量放在任何地方。在许多当前的操作系统中,堆栈向下增长,因此如果编译器天真地按堆栈顺序分配变量,则稍后在较低内存位置声明的变量。但同样,这完全是武断的。