由于堆栈向下增长,即向数字较小的内存地址增长,为什么 &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 运算符 &
时)。这样做只是为了“让事情顺利进行”吗?
最佳答案
Correct me if I'm wrong, but I'd imagine this was a design decision of C creators
它不是C语言设计的一部分,C++也不是。事实上,不存在这些标准认可的“堆”或“堆栈”内存。
这是一个实现细节。每种语言的每种实现方式都可能不同。
指向不相关对象的指针之间的有序比较,例如 &i < &j
或 (void*)pin > (void*)pi
有一个未指定的结果。两者都不能保证小于或大于另一个。
就其值(value)而言,您的示例程序在我的系统上输出了三个“false”计数。
关于c++ - 如果堆栈在数值较低的地址增长,为什么指针比较会反转它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57773450/