簡體   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