2013-08-28 62 views
1

我不知道是否總是會編譯下面的代碼,以便不存在非法的NULL ptr解引用?如果邏輯運算優先級的評估爲C組合

我的問題是編譯器可能會在首先檢查「b」是否爲NULL之前檢查b->值。

typedef struct 
{ 
    int value; 
} mystruct; 

int func(mystruct * b) 
{ 
    if((NULL == b) || (b->value == 0)) 
    { 
     return -1; 
    } 

    printf("value: %d\n", b->value); 
} 
+1

可能重複的[如果括號中的語句的評估順序如果(...)?](http://stackoverflow.com/questions/18450585/what-is-the-order-of-評價-的語句-IN-A-IF-托架-IF)。簡短的回答,'||'從左到右評估並將短路,細節在dup列出。應該更加小心,這是一個C的問題,這是一個[更好的重複](http://stackoverflow.com/questions/628526/is-short-circuiting-boolean-operators-mandated-in-cc-and-評估順序) –

回答

2

b如果是NULL(NULL != b)然後是,則第二側將被檢查。 (請參閱Short-Circuit evaluation),您可能會得到NULL ptr解引用。

變化||&&

0

您不必擔心,第二個條件將不會執行,除非結果尚未由第一個條件確定。