【问题标题】:Why does this conditional cause a seg fault?为什么这个条件会导致段错误?
【发布时间】:2012-05-17 22:52:43
【问题描述】:

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

// 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')
        // ...

【问题讨论】:

  • 这不是你的问题,但请注意,仅仅因为指针非空并不意味着它是有效的......

标签: c pointers dereference


【解决方案1】:
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')

改为。

【讨论】:

    【解决方案2】:

    &&higher precedence|| 所以代码相当于:

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

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

    【讨论】:

      【解决方案3】:

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

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

      基本上,只要您的代码中同时包含&&||,您就需要在其中加上括号以确保它符合您的要求。

      【讨论】:

        【解决方案4】:

        你有 Null ptr && dereferenced Null ptr 这会导致段错误。

        C 让您可以选择让 if (ptr == NULL) 之类的语句做某事; 如果它总是在检测到空指针时将条件评估为 false,那么这样的语句将不起作用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-16
          • 2017-08-18
          • 1970-01-01
          • 2015-06-12
          相关资源
          最近更新 更多