C++ 为什么是变量';堆栈上的地址不连续

C++ 为什么是变量';堆栈上的地址不连续,c++,c++11,pointers,C++,C++11,Pointers,(我在Windows Visual Studio 2019版本16.7上执行此测试) const char a='a'; 常量字符b='b'; 常量字符c='a'; intptr_t ptr_a=(intptr_t)和a; intptr_t ptr_b=(intptr_t)和b; intptr_t ptr_c=(intptr_t)&c; 标准::cout 堆栈上的地址应该是连续的,对吗 不,不要求不属于同一数组或对象的变量地址之间的关系。它们不必是连续的,或者类似的。此外,就语言而言,甚至不必有

(我在Windows Visual Studio 2019版本16.7上执行此测试)

const char a='a';
常量字符b='b';
常量字符c='a';
intptr_t ptr_a=(intptr_t)和a;
intptr_t ptr_b=(intptr_t)和b;
intptr_t ptr_c=(intptr_t)&c;
标准::cout
堆栈上的地址应该是连续的,对吗

不,不要求不属于同一数组或对象的变量地址之间的关系。它们不必是连续的,或者类似的。此外,就语言而言,甚至不必有堆栈


事实上,对这些指针执行任何指针算法都会调用未定义的行为。但是,你可以比较指针的相等性。

< P> C++标准只要求对象在同一个数组中是连续的。 你的例子不是这样的

intptr_t ptr_a=(intptr_t)&a是实现定义的。
ptr_b-ptr_a
的值也是实现定义的


(请注意,
&b-&a
的值未定义。)

如其他人所述,变量不在数组中,因此不需要在连续内存中

此外,由于变量被标记为
const
,因此它们可以放在只读内存中,或者放在可执行文件的数据部分


另外,请注意,它们的位置可能会因优化级别而改变。

堆栈上的地址应该是连续的,对吗?
-错,语言标准没有规定这一点(此外,它甚至没有规定应该首先使用堆栈实现局部变量)。请注意,优化编译器可以检测到您实际上没有使用
&a
,因此该值可以是任何唯一的数字。当您这样使用它时,它只需要是一个“真实”堆栈地址。@MSalters优化编译器将忽略这些未实际使用的变量。但是,std::cout语句中已经使用了&a。我认为,如果(&a==&b)
,即使它们不是同一数组中的对象,您也可以编写
。@Bathsheba您完全正确。编辑了答案,谢谢。谢谢你的帮助。堆栈上的地址应保持增加或减少。它们朝着同一方向生长。理解这种混乱的地址很奇怪。是的,这是一个有趣的问题。但这不是一个C++问题,谢谢你的帮助。也许编译器这样做是为了安全。实际上,我只是想知道堆栈上地址增长的方向,增加或减少。
    const char a = 'a';
    const char b = 'b';
    const char c = 'a';

    intptr_t ptr_a = (intptr_t)&a;
    intptr_t ptr_b = (intptr_t)&b;
    intptr_t ptr_c = (intptr_t)&c;

    std::cout << ptr_b - ptr_a << "  " << ptr_c - ptr_b << std::endl;