考虑以下代码,在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 */
}
答案 0 :(得分:11)
你没有定义什么" safe"对您而言意味着,但无论如何,您提出的代码都有未定义的行为。指针算法仅允许指向数组对象的指针值,或者可能指向数组的一端。 (出于此规则的目的,非数组对象被视为一个元素的数组。)
由于空指针永远不是对象的地址或者是对象的地址,因此您的代码永远不会有明确定义的行为。
答案 1 :(得分:5)
is it safe to do pointer arithmetic on nullptr?
C ++ 定义 nullptr
上的两种操作。对于:
float * x=nullptr;
float * y=nullptr;
x +/- 0 = x
x-y=0 //note x and y have the same type
您无法对未定义的内容做出假设,因此您不应该这样做。
答案 2 :(得分:2)
...在nullptr上进行指针运算是否安全?
不,nullptr
上的算术定义不明确,因为它本身不是指针类型(但存在所有指针类型的NULL值的转换)。
std::nullptr_t
是空指针文字nullptr
的类型。它是一种不同的类型,它本身不是指针类型或指向成员类型的指针。
一般来说,任意指针算术(即使是在NULL值上)几乎肯定会导致问题 - 你没有分配那个内存 - 你不能尝试读取或写入。
为了进行比较(例如,一个结束时),你会没事的,但是你拥有的代码会导致未定义的行为。
如需进一步阅读,请参阅undefined behavior上的维基百科。
答案 3 :(得分:1)
不,向nullptr添加偏移量不会导致nullptr。这是未定义的行为。