2012-05-17 51 views
1

这是什么原因?我认为如果一个指针为null,那么其余的条件将不会被评估。为什么有条件导致seg故障?

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

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

回答

5
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') 

改为。

1

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

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

基本上,任何时候你有你的代码都&&||,你需要一个括号在那里,以确保它做什么,你的意思是它。

3

&&具有higher precedence||所以代码等同于:

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

以及如果所述第一(...&&..)失败,那么的||后半部分进行评价。

1

您有空ptr & &解除引用seg故障的空ptr。

C给你的选项有if(ptr == NULL)这样的语句; 如果在检测到空指针时总是将条件评估为false,则此类语句不起作用。