为什么这个条件会导致seg错误?

时间:2012-05-17 22:52:43

标签: c pointers dereference

这是什么原因?我认为如果指针为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')
        // ...

4 个答案:

答案 0 :(得分:5)

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

表示:

  • if ptr && ptr[0] == '1'(false,因为ptr为空且ptr[0] == '1'未获得评估)
  • ptr[0] == 't'(繁荣)

使用:

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

代替。

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

您的评估顺序不正确。这将有效:

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

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

答案 3 :(得分:1)

你有Null ptr&& dereferenced Null ptr导致seg错误。

C使您可以选择if(ptr == NULL)之类的语句; 如果在检测到空指针时始终将条件评估为false,则此类语句将无效。