检查指针是否为空是否安全,然后在同一if语句中取消引用它?

时间:2012-12-08 22:34:57

标签: c++ c pointers conditional-statements

如果传入空指针,以下代码是否安全?

if(ptr && *ptr == value)
{
   //do something
}

支票的顺序是否重要?如果我把它改成它会有用吗?

if(*ptr == value && ptr)
{
   //do something
}

4 个答案:

答案 0 :(得分:18)

前者是正确和安全的,后者则不是。

内置&&运算符具有短路语义,这意味着当且仅当第一个参数为真时,才会计算第二个参数。

重载运算符不是这种情况。)

答案 1 :(得分:3)

是(1)因短路而安全。这是评估逻辑语句的方式。如果&&语句的第一部分为假,则整个语句永远不会为真,因此它不会尝试评估第二部分。

和(2)是不安全的,因为它首先取消引用空指针,这是未定义的行为。

编辑:

参考下面的KerrekSBs评论: Why dereferencing a null pointer is undefined behaviour?

从该帖子的第一个答案开始:

  

定义解除引用NULL指针的一致行为   要求编译器在每个之前检查NULL指针   在大多数CPU架构上取消引用。这是不可接受的   burdern是一种专为速度而设计的语言。

同样存在(历史上)硬件,其中NULL指向的内存(并非总是0)实际上可以在程序中寻址并且可以被解除引用。因此,由于缺乏共识和一致性,因此决定取消引用空指针将是“未定义的行为”

答案 2 :(得分:1)

如果指针无效(或者更确切地说是NULL),则在第一个版本short-circuiting中将阻止对*ptr == value的评估,因此第一个是安全的。

第二个将始终访问*ptr,无论它是否有效。

答案 3 :(得分:1)

除了所有其他关于ptr && *ptr == value有效的答案,但不是相反,有效指针的概念可能有不同的含义。

ptr可能是一个未初始化的变量,或者可以通过某种随机intptr_t整数中的强制转换来获取,但它不会指向任何地方(例如{{3} }})但不是null。

在这种情况下,测试的顺序都不起作用。

某些指针可能无效且非空(然后测试ptr && *ptr == value未定义的行为)。没有可移植的方法来测试它们。 (但您可以使用操作系统或处理器特定的技巧)。