c++ - 为什么变量在堆栈上的地址不是连续的
问题描述
(我在 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?
解决方案
栈上的地址应该是连续的吧?
不,对于不属于同一数组或对象的变量的地址之间的关系没有要求。它们不必是连续的,或类似的东西。此外,就语言而言,甚至不必有堆栈。
事实上,对这些指针进行任何指针运算都会调用未定义的行为。不过,您可以比较指针是否相等。
推荐阅读
- html - 将局部变量传递给 click 函数
- python - BeautifulSoup 找不到给定类的列表元素
- javascript - 当使用 CSS 找不到图像时,是否可以为每页定义一个全局“断开链接”图像?
- wordpress - 如何从树枝/木材文件中获取子类别名称?
- javascript - 反应组件正在传递 useState 的默认值,而不是传递 API 数据
- c++ - C ++中正确的球体碰撞分辨率
- swift - SwiftUI 中的嵌套过渡/动画
- python - 如何在 for 循环(python)中重置增量变量?
- regex - 正则表达式 ”?!” 有变量
- gekko - 为什么 12 秒后 MHE 对我的模型持怀疑态度?