如何解决从nullptr减去指针不会产生期望值
为什么某些指针数学运算会导致编译器之间的结果不明确?
#include <cstdint>
int main()
{
int * test = new int{100};
int * a = nullptr;
auto diff = test - a;
int * test_copy = diff + a;
return *test_copy;
}
- GCC认为结果是100。
- Clang认为结果是132。
- MSVC认为结果也不是100。
解决方法
减去两个不指向同一数组元素的指针的结果是 undefined 。 (允许使用数组末尾之外的一个,为此目的,一个对象被视为单个元素数组。)
您可以通过将每个指针转换为整数类型来定义它:
auto res = (std::ptrdiff_t)test - (std::ptrdiff_t)a;
但是遗憾的是这样做的结果甚至是实现定义的。
如果两个指针类型加在一起,则编译器需要发出诊断。
,这里的问题是指针没有指向同一对象。将operator+
或operator-
应用于不属于同一对象的指针是不确定的行为。
test
来自全局operator new
。 nullptr
不是全局operator new
管理的内存的一部分。这也是需要指出的两个单独的问题。
如果a
和test
来自缓冲区int[]
,则它们来自同一对象,没问题。
#include <cstdint>
int main()
{
int buff[2]{100,0};
int * test = &buff[0];
int * a = &buff[1];
auto diff = test - a;
int * test_copy = diff + a;
return *test_copy;
}
现在编译器似乎很高兴。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。