2016-07-25 58 views
-5

我有以下代碼:C不可變的參數值?

void func(uint8 *var) { 
    uint8 tempvar; 

    if (var) 
     var = &tempvar; 

    *var = 0; 
} 

我請使用函數:

func(NULL); 

的代碼給出在線路分段故障 「* VAR = 0;」因爲var仍然指向內存地址0x0。我不明白爲什麼我的分配給一個臨時變量不起作用!

+3

「爲什麼我的分配給臨時變量不起作用」。那麼,如果'var'最初爲null,那麼它不工作,因爲你明確要求程序*跳過*那個分配。你的if條件就是這個意思。 – AnT

+0

@πάνταῥεῖ - 嗯,它是範圍內的局部變量,我只在範圍內使用它。該參數是一個單一的指針,地址的變化不會修改調用者變量。因此,在其範圍之外沒有訪問變量。 –

+0

已經知道了...... –

回答

7

因爲您省略了!。您正在測試變量是否存在,但你應該測試它是否不存在if (!var) ...

要展開遠一點...... varuint8 *型的,從而VAR本身就是一個指針。通過編寫if (var)您正在測試該指針是否不爲NULL。在僞代碼,代碼表示:

if (the var pointer already exists) 
    assign a new pointer to it (make it point to somewhere else) 

但是,如果它不存在(如果它指向NULL),你不要管它。您可以使用調試器或簡單的打印語句進行驗證。因此,你最終在賦值時使用空指針,並且會導致程序崩潰。

+0

如果(var)轉換爲if(var == 0),那麼它與if(var == NULL)等價嗎? –

+5

沒有。 '如果(...)'測試是否是真的。零(NULL)值提升爲false;所有其他值爲true。無論如何,試試吧! –

+0

@ H.Guijt這不是確定的原因,如果(NULL)是假的 –