【问题标题】:Null pointer dereference prevention [duplicate]空指针取消引用预防[重复]
【发布时间】:2019-01-06 05:25:12
【问题描述】:

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

【问题讨论】:

  • “如何使用表达式来防止取消引用”是什么意思? ?似乎p && *p 本身就是一个任意示例,说明您如何能够防止空指针取消引用。
  • 如我所见,这是一个条件,但我无法理解为什么它应该是真的,以防万一p!=NULL
  • 哦,我可能忘记了,在 C 语言中,布尔逻辑中的任何非零值都为真

标签: c null-pointer


【解决方案1】:

来自 C 标准#6.3.2.3p3

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

脚注

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

逻辑AND 操作expr1 && expr2 采用短路行为。使用逻辑短路,第二个操作数 expr2 仅在结果未完全由第一个操作数 expr1 确定时才被计算。 也就是说,如果expr1 是逻辑0 (false),则不会评估expr2

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

【讨论】:

    【解决方案2】:

    这里

        p    &&   *p   
        |          |
       first     second 
       operand   operand
    

    首先执行p,这意味着如果pNULL,那么它不会执行*p,因为逻辑AND && 运算符属性是如果第一个操作数 是@ 987654327@ 然后不检查/评估第二个操作数,因此它可以防止空指针取消引用。

    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 */
    }
    

    【讨论】:

    • 好吧,如果p = NULL 那么我们用空指针进入else语句,所以没有预防
    • 是的。我把支票反过来了。我的错。我会尽快编辑我的系统。
    • 我在玩那个例子,我注意到如果我们设置int x = 0; int *p = &x;,那么代码会将 p 视为空指针。因此,如果我们指向一个当前值为 0 的变量,那么我们将无法进一步处理代码
    猜你喜欢
    • 1970-01-01
    • 2013-02-20
    • 2015-10-30
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多