c++ nullptr和指针算法

ezykj2lf  于 2023-04-01  发布在  其他
关注(0)|答案(5)|浏览(175)

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

62lalag41#

你没有定义“安全”对你意味着什么,但是不管怎样,你提出的代码有未定义的行为。指针算术只允许指向数组对象的指针值,或者可能指向数组的末尾。(非数组对象被认为是一个元素的数组。)
由于空指针从来不是对象的地址或对象的过去地址,因此您的代码永远不会有定义良好的行为。

krcsximq

krcsximq2#

nullptr上做指针运算安全吗?
C++定义了两种对nullptr的操作,如:

float *x = nullptr;
float *y = nullptr;
  1. x +/- 0 = x
  2. x - y = 0xy具有相同类型)
    你不能对没有定义的东西做出假设,所以你不应该这样做。
nue99wik

nue99wik3#

0添加到nullptr具有定义良好的行为,并返回nullptr
nullptr添加任何其他内容都会产生未定义的行为。
[表达式添加]/4有
当一个整型的表达式J与一个指针类型的表达式P相加或相减时,结果的类型为P。

  • 如果P的计算结果为空指针值,而J的计算结果为0,则结果为空指针值。
  • 否则,如果P指向一个有n个元素的数组对象x的数组元素i([dcl.array]),表达式P + J和J + P(其中J的值为j)如果0≤i+j≤n则指向x的(可能假设的)数组元素i+j,表达式P-J如果0≤ i-j ≤n则指向x的(可能假设的)数组元素i-j。
  • 否则,行为未定义。

第一个要点涵盖了添加零,第二个要点涉及数组,最后一个要点涵盖了其他所有内容。
因为我们从来没有一个数组,所以我们可以忽略第二个项目符号,只处理第一个和第三个项目符号。这使得我们添加零是定义行为,添加任何其他值都是未定义行为。

vddsk6oq

vddsk6oq4#

在nullptr上做指针运算安全吗?
不,nullptr上的算术没有很好的定义,因为它本身不是一个指针类型(但是所有指针类型都存在到NULL值的转换)。
See here ;
std::nullptr_t是空指针文字nullptr的类型。它是一个独特的类型,本身不是指针类型或指向成员类型的指针。
一般来说,任意的指针运算(即使是NULL值)几乎肯定会导致问题-你没有分配内存-它不是你试图读取或写入的。
出于比较的目的(例如,一个过去的结束),你会很好,但否则你的代码将导致未定义的行为。
更多阅读请参见Wikipedia on undefined behavior

55ooxyrt

55ooxyrt5#

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

相关问题