如何解决为什么变量在堆栈上的地址不是顺序的
(我在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”
如果我在发布中运行这段代码,则重用为: “ -1 2”
因此,问题是: sizeof(char)为1,但是为什么我们得到“ 32 32”,堆栈上的地址应该是连续的,对吗? 而且,在发布模式下,为什么ptr_b小于ptr_a?
解决方法
堆栈上的地址应该是连续的,对吧?
否,不要求不属于同一数组或对象的变量的地址之间的关系。它们不必是连续的或类似的东西。另外,就语言而言,甚至不必有堆栈。
实际上,对这些指针执行任何指针运算都会调用未定义的行为。但是,您可以比较指针是否相等。
,C ++标准仅要求对象在同一阵列中在内存中是连续的。
在您的示例中情况并非如此。
intptr_t ptr_a = (intptr_t)&a;
的行为是定义的实现。 ptr_b - ptr_a
的值也是实现定义的。
(请注意,&b - &a
的值是 undefined 。)
如其他人所述,变量不在数组内部,因此不需要它们位于连续内存中。
此外,由于变量被标记为const
,因此可以将它们放置在只读存储器中或可执行文件的数据部分中。
另外,请注意,由于优化级别的缘故,它们的位置可能会发生变化。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。