2012-05-17 86 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,則此類語句不起作用。