nullptr和指针算术

时间:2016-07-22 12:31:50

标签: c++ c++11 pointers nullptr

考虑以下代码,在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 */
}

4 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:5)

is it safe to do pointer arithmetic on nullptr? 

C ++ 定义 nullptr上的两种操作。对于:

float * x=nullptr;
float * y=nullptr;
  1. x +/- 0 = x

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

  3. 您无法对未定义的内容做出假设,因此您不应该这样做。

答案 2 :(得分:2)

  

...在nullptr上进行指针运算是否安全?

不,nullptr上的算术定义不明确,因为它本身不是指针类型(但存在所有指针类型的NULL值的转换)。

See here;

  

std::nullptr_t是空指针文字nullptr的类型。它是一种不同的类型,它本身不是指针类型或指向成员类型的指针。

一般来说,任意指针算术(即使是在NULL值上)几乎肯定会导致问题 - 你没有分配那个内存 - 你不能尝试读取或写入。

为了进行比较(例如,一个结束时),你会没事的,但是你拥有的代码会导致未定义的行为。

如需进一步阅读,请参阅undefined behavior上的维基百科。

答案 3 :(得分:1)

不,向nullptr添加偏移量不会导致nullptr。这是未定义的行为。