首页 > 解决方案 > 为什么变量在堆栈上的地址不是连续的

问题描述

(我在 Windows Visual Studio 2019 Version16.7 上做这个测试)

    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;

如果我在Debug下运行这段代码,结果是:“32 32”

如果我在 release 下运行这段代码,结果是:“-1 2”

那么问题来了:sizeof(char) 是 1,但是为什么我们得到“32 32”,栈上的地址应该是连续的,对吧?而且,在发布模式下,为什么ptr_b小于ptr_a?

标签: c++c++11pointers

解决方案


栈上的地址应该是连续的吧?

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

事实上,对这些指针进行任何指针运算都会调用未定义的行为。不过,您可以比较指针是否相等。


推荐阅读