如果传入空指针,以下代码是否安全?
if(ptr && *ptr == value)
{
//do something
}
支票的顺序是否重要?如果我把它改成它会有用吗?
if(*ptr == value && ptr)
{
//do something
}
答案 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
是未定义的行为)。没有可移植的方法来测试它们。 (但您可以使用操作系统或处理器特定的技巧)。