空指针取消引用预防

时间:2019-01-06 05:25:12

标签: c null-pointer

为什么p && *p防止空指针取消引用? 如何使用表达式防止取消引用?

2 个答案:

答案 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

如果pNULL指针,则它将被评估为0,并且由于&&运算符*p的短路行为而不会被使用。评估。这就是p && *p防止空指针取消引用的方式。

答案 1 :(得分:1)

这里

    p    &&   *p   
    |          |
   first     second 
   operand   operand

首先执行p,这意味着如果pNULL,那么它不会做*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 */
}