我有以下代碼:C不可變的參數值?
void func(uint8 *var) {
uint8 tempvar;
if (var)
var = &tempvar;
*var = 0;
}
我請使用函數:
func(NULL);
的代碼給出在線路分段故障 「* VAR = 0;」因爲var仍然指向內存地址0x0。我不明白爲什麼我的分配給一個臨時變量不起作用!
我有以下代碼:C不可變的參數值?
void func(uint8 *var) {
uint8 tempvar;
if (var)
var = &tempvar;
*var = 0;
}
我請使用函數:
func(NULL);
的代碼給出在線路分段故障 「* VAR = 0;」因爲var仍然指向內存地址0x0。我不明白爲什麼我的分配給一個臨時變量不起作用!
因爲您省略了!
。您正在測試變量是否存在,但你應該測試它是否不存在:if (!var) ...
要展開遠一點...... var
是uint8 *
型的,從而VAR本身就是一個指針。通過編寫if (var)
您正在測試該指針是否不爲NULL。在僞代碼,代碼表示:
if (the var pointer already exists)
assign a new pointer to it (make it point to somewhere else)
但是,如果它不存在(如果它指向NULL),你不要管它。您可以使用調試器或簡單的打印語句進行驗證。因此,你最終在賦值時使用空指針,並且會導致程序崩潰。
如果(var)轉換爲if(var == 0),那麼它與if(var == NULL)等價嗎? –
沒有。 '如果(...)'測試是否是真的。零(NULL)值提升爲false;所有其他值爲true。無論如何,試試吧! –
@ H.Guijt這不是確定的原因,如果(NULL)是假的 –
「爲什麼我的分配給臨時變量不起作用」。那麼,如果'var'最初爲null,那麼它不工作,因爲你明確要求程序*跳過*那個分配。你的if條件就是這個意思。 – AnT
@πάνταῥεῖ - 嗯,它是範圍內的局部變量,我只在範圍內使用它。該參數是一個單一的指針,地址的變化不會修改調用者變量。因此,在其範圍之外沒有訪問變量。 –
已經知道了...... –