繁体   English   中英

为什么这种情况会导致段故障?

[英]Why does this conditional cause a seg fault?

这是什么原因呢? 我认为如果指针为null,则不会评估其余条件。

// doesn't work:
char *ptr = somefunction();

if (ptr && ptr[0] == '1' || ptr[0] == 't')
  // ...



// does work:
char *ptr = somefunction();
if (ptr)
    if (ptr[0] == '1' || ptr[0] == 't')
        // ...
ptr && ptr[0] == '1' || ptr[0] == 't'

手段:

  • 如果ptr && ptr[0] == '1' (错误,因为ptr为空并且ptr[0] == '1'没有得到评估)
  • ptr[0] == 't' (景气)

采用:

ptr && (ptr[0] == '1' || ptr[0] == 't')

代替。

&& 优先级高于|| 所以代码等效于:

if ((ptr && ptr[0] == '1') || ptr[0] == 't')

如果前一个(...&&..)失败,则||后半部分 被评估。

您的评估顺序不正确。 这将起作用:

if (ptr && (ptr[0] == '1' || ptr[0] == 't'))

基本上,只要您同时拥有&&|| 在您的代码中,您需要在其中加一个括号以确保它能够达到您的期望。

您有Null ptr &&取消引用了Null ptr,这会导致段错误。

C使您可以选择让语句像if(ptr == NULL)做某事; 如果在检测到空指针时始终将条件评估为false,则这样的语句将不起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM