由于堆栈向下增长,即朝着数字较小的内存地址增长,为什么这样做&i < &j
是正确的。如果我错了,请纠正我,但我想这是 C 创建者的设计决定(C++ 维护)。但我想知道为什么。
同样奇怪的是,堆分配的对象pin
位于数值上比堆栈变量更高的内存地址,这也与堆位于数值上小于堆栈的内存地址(并且向上增加)的事实相矛盾。
#include <iostream>
int main()
{
int i = 5; // stack allocated
int j = 2; // stack allocated
int *pi = &i; // stack allocated
int *pj = &j; // stack allocated
std::cout << std::boolalpha << '\n';
std::cout << (&i < &j) && (pi < pj) << '\n'; // true
struct S
{
int in;
};
S *pin // stack allocated
= new S{10}; // heap allocated
std::cout << '\n' << (&(pin->in) > &i) << '\n'; // true
std::cout << ((void*)pin > (void*)pi) << '\n'; // true
}
到目前为止我是对的吗?如果是这样,为什么 C 设计人员会扭转这种情况,即数字较小的内存地址看起来更高(至少在您比较指针或通过 addressof 运算符时&
)。这样做只是为了“让事情顺利进行”吗?