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的变量,那么我们无法进一步处理代码