C 空指针取消引用预防

C 空指针取消引用预防,c,null-pointer,C,Null Pointer,为什么p&&*p阻止空指针解引用? 如何使用表达式来防止取消引用 这里 p && *p | | first second operand operand 首先执行p,这意味着如果p为NULL,则它不会执行*p,因为逻辑和&运算符属性是,如果第一个操作数为false则不检查/计算第二个操作数,因此它可以防止空指针取消引用 事实上,p=NULL意味着p指向NULL,因此不应执行*p,因为这会导致分段错误。例

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

这里

    p    &&   *p   
    |          |
   first     second 
   operand   operand
首先执行
p
,这意味着如果
p
NULL
,则它不会执行
*p
,因为逻辑和
&
运算符属性是,如果第一个操作数
为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 */
}
来自C标准#6.3.2.3p3

3值为0的整型常量表达式或转换为void*类型的表达式称为空指针常量。66)如果将空指针常量转换为指针类型,则生成的指针(称为空指针)保证与指向任何对象或函数的指针进行不相等的比较。

脚注

66)宏NULL在(和其他标头)中定义为NULL指针常量;见7.19

逻辑
操作
expr1和&expr2
采用短路行为。对于逻辑短路,只有当第一个操作数expr1不能完全确定结果时,才会对第二个操作数expr2求值。 也就是说,如果
expr1
是逻辑
0
(false),则不计算
expr2


如果
p
NULL
指针,则它将被评估为
0
,并且由于
和&
操作员的短路行为,
*p
将不会被评估。这就是
p&&*p
如何防止空指针取消引用。

您所说的“如何使用表达式防止取消引用”是什么意思?似乎
p&&*p
本身就是一个任意的例子,说明了如何防止空指针解引用。正如我所看到的,这是一个条件,但我无法理解为什么在
p的情况下它应该是真的=NULL
噢,可能我忘了在C中,布尔逻辑井中的任何非零值都是真的,如果
p=NULL
,那么我们使用NULL指针进入else语句,所以没有预防是真的。我把支票倒过来。我的错。当我有了我的系统后,我会立即进行编辑。我正在玩这个例子,我注意到如果我们设置
intx=0;int*p=&x然后代码将p视为空指针。因此,如果我们指向一个当前值为0的变量,那么我们无法进一步处理代码