【发布时间】:2025-12-19 15:20:13
【问题描述】:
由于堆栈向下增长,即朝着数字较小的内存地址增长,为什么&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 运算符 & 时)。这样做只是为了“让事情顺利进行”吗?
【问题讨论】:
-
比较不属于同一数组的元素的地址是未指定的行为,除了(不)相等。结果取决于您的平台/实现。
-
尝试比较两个不同堆栈帧中变量的地址,例如将
pj传递给函数并将其与该函数中局部变量的地址进行比较 -
@FrançoisAndrieux 它真的没有定义,还是没有意义?我认为您可以比较指针就好了,但是由于变量在内存中的放置完全是编译器的工作,您的程序不应该关心大多数比较的结果是什么。
-
@Caleb 该标准明确表示未指定。每个实现都定义了自己的规则,但他们需要定义一些规则。你一定在编辑之间发现了我的评论。
标签: c++ stack heap-memory memory-address design-decisions