2016-12-03 72 views
2

比方說,我有這樣的代碼在if語句中,如果我爲變量賦值,是否必須在else語句中再次執行?

if ((p = malloc(int)) == null) { do something } 

else { do something else with p } 

我知道語法可能是不正確的,但如果讓說,裏面的if語句的條件是不正確的,不等於空,我們移動到else語句,如果我試圖在else語句中使用pp仍將被分配malloc(int)?或者我必須在else語句中再次分配malloc(int)p

+1

「意志p仍然被分配的malloc」 - 它沒有被分配malloc'的'結果*現在*不管。如果您*不想泄漏內存,語法只是不正確。你的任務應該包含在parens中。解決這個問題,'else'塊應該有一個非空'p',導致'if'測試失敗。 – WhozCraig

+0

你可以用簡單的賦值來測試這個假設,而不是用一個可能指向有效內存的指針搞亂UB。不,你不必在'else'塊中重複賦值。 – Beta

回答

2

的邏輯是以下

if ((p = malloc(sizeof(int))) == NULL) 
{ 
    // Here p is equal to NULL 
    // skip the else statement 
} else { 
    // Jump here if the allocation was successful and p is not equal to NULL 
} 

因此,如果你將正確使用括號,然後在第一個分配

p = malloc(sizeof(int)) 

檢查條件之前被評估。

+0

我有一個快速跟進問題。可以說我有在C 結構的東西{ \t的INT A下面的結構; \t int B; }; 如果我決定使用malloc爲它分配空間,並將空間分配給int * p。分配的空間是否包含一個結構事物,我可以使用p-> A或p-> B來訪問其參數A和B?或者它只是一個內存空間,我存儲一個結構? –

+0

@JohnGringus你可以定義一個結構的對象,就像struct thing t;並訪問像t.A和t.B這樣的數據成員。或者你可以動態地分配一個對象,比如struct thing * t = malloc(sizeof(struct thing));並訪問它的數據成員,如t-> A和t-> B。 –

3

在這個特殊的例子,p是沒有得到什麼分配你認爲它是。等號運算符==的優先級高於賦值運算符=

所以這個:

(p = malloc(int) == null) 

是一樣的:

(p = (malloc(int) == null)) 

這意味着p被分配布爾表達式的結果。

你想要的是:

((p = malloc(int)) == null) 

這就賦予的mallocp結果,然後比較反對NULL該值。無論條件是否正確,分配都已完成。因此p包含NULL或指向動態分配內存的指針。