微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从nullptr减去指针不会产生期望值

如何解决从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;
}

https://godbolt.org/z/GvfG1M

  • GCC认为结果是100。
  • Clang认为结果是132。
  • MSVC认为结果也不是100。

解决方法

减去两个不指向同一数组元素的指针的结果是 undefined 。 (允许使用数组末尾之外的一个,为此目的,一个对象被视为单个元素数组。)

您可以通过将每个指针转换为整数类型来定义它:

auto res = (std::ptrdiff_t)test - (std::ptrdiff_t)a;

但是遗憾的是这样做的结果甚至是实现定义的。


如果两个指针类型加在一起,则编译器需要发出诊断。

,

这里的问题是指针没有指向同一对象。将operator+operator-应用于不属于同一对象的指针是不确定的行为。

test来自全局operator newnullptr不是全局operator new管理的内存的一部分。这也是需要指出的两个单独的问题。

如果atest来自缓冲区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;
}

https://godbolt.org/z/5M9TTM

现在编译器似乎很高兴。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。