为什么p && *p
防止空指针取消引用?
如何使用表达式防止取消引用?
答案 0 :(得分:3)
来自C Standard#6.3.2.3p3
3值为0的整数常量表达式,或者将其转换为类型void *的表达式称为空指针常量。66)如果将空指针常量转换为指针类型,则结果指针称为a。空指针,保证将不相等的值与指向任何对象或函数的指针进行比较。
...
...脚注
66)宏NULL在(和其他标头中)定义为空指针常量;见7.19。
逻辑AND
操作expr1 && expr2
采用短路行为。如果发生逻辑短路,则只有当第一个操作数expr2
不能完全确定结果时,才评估第二个操作数expr1
。
也就是说,如果expr2
是逻辑expr1
(否),则不会评估0
。
如果p
是NULL
指针,则它将被评估为0
,并且由于&&
运算符*p
的短路行为而不会被使用。评估。这就是p && *p
防止空指针取消引用的方式。
答案 1 :(得分:1)
这里
p && *p
| |
first second
operand operand
首先执行p
,这意味着如果p
是NULL
,那么它不会做*p
,因为逻辑AND &&
运算符属性是,如果< strong>第一个操作数为false
,则不要检查/评估第二个操作数,因此它可以防止空指针取消引用。
p = NULL
意味着p
指向NULL
的事实,因此不应执行*p
,因为它会导致分段错误。例如
int *p = NULL;
if (!p ) {
fprintf(stderr,"p is NULL, can't do further opertaion with p\n");
exit(0);
}
else {
/* further processing with p i.e p is valid and *p is not zero */
}