nullptr和指针算术

use*_*453 8 c++ pointers nullptr c++11

考虑以下代码,是否可以安全地进行指针运算nullptr

我假设nullptr在另一个结果中添加任何偏移nullptr,到目前为止MSVC产生的结果与我预期的一样,但是我有点不确定这样使用是否nullptr安全:

float * x = nullptr;

float * y = x + 31; // I assume y is a nullptr after this assigment

if (y != nullptr)
{
  /* do something */
}
Run Code Online (Sandbox Code Playgroud)

Ker*_* SB 11

您没有定义"安全"对您意味着什么,但无论如何,您提出的代码都有未定义的行为.指针算法仅允许指向数组对象的指针值,或者可能指向数组的一端.(出于此规则的目的,非数组对象被视为一个元素的数组.)

由于空指针永远不是对象的地址或对象的地址,因此您的代码永远不会有明确定义的行为.

  • @ tobi303:它没有参考,因为标准不必明确声明它是未定义的.[expr.add]/5定义指针+整数*的行为*指向数组的指针(或指向对象的指针,作为1的数组).如果指针没有指向数组,那么根据定义,行为是未定义的(除了添加0,[expr.add]/8为所有指针定义的情况除外). (5认同)
  • @ tobi303 UB并不意味着"崩溃",它意味着"我们没有定义它的作用".实际上,编译器可以积极地优化和检测UB,并导致程序出现意外行为.一个优化学校是"由于UB不能在一个格式良好的程序中出现,任何导致UB的逻辑链都可以作为一种可能性被安全地消除,直到并包括在代码中跳过明确的`if`检查".简而言之,UB可能导致*时间旅行*错误,其中远离UB的代码的行为方式与您编写的代码不匹配. (3认同)

sjs*_*sam 5

is it safe to do pointer arithmetic on nullptr? 
Run Code Online (Sandbox Code Playgroud)

C++ 定义了两种操作nullptr.用于:

float * x=nullptr;
float * y=nullptr;
Run Code Online (Sandbox Code Playgroud)
  1. x +/- 0 = x

  2. x-y=0 //note x and y have the same type

你不能对未定义的内容做出假设,所以你不应该这样做.

  • 实际上,还定义了第三个操作:`x == y`.看起来很简单,但它确实意味着只有一个空指针值. (2认同)