簡體   English   中英

為什么沒有對空指針取消引用的段錯誤?

[英]Why no segfault on null pointer dereference?

我已經寫了這個簡單的C代碼,

int main()
{
        int *p = NULL;
        if (p && *p);
        //if (*p && p);
        return 0;
}

當我運行這段代碼時,出乎意料的是我沒有任何段錯誤。 但是,如果我在if ()更改p*p順序(如注釋中所示),則確實會出現段錯誤。

有人可以解釋為什么嗎?

&&運算符具有短路評估。 如果僅通過查看左操作數的值即可確定結果,則不評估右操作數。 對於&&運算符,這意味着如果左側的結果為false,則不評估右側,結果為false。 換一種說法,

if (p && *p) ...

相當於

if (p) if (*p) ...

根據C11標准,第6.5.13 / 4節:

與按位二進制&運算符不同,&&運算符保證從左到右的求值; 如果對第二個操作數求值,則在第一個和第二個操作數的求值之間有一個序列點。 如果第一個操作數比較等於0,則不評估第二個操作數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM