int f(int *x)
{
*x = 5;
return *x;
}
int main()
{
int * y = 0;
int z = f(y);
}
爲什麼此代碼會給我一個運行時錯誤?你可以通過解引用指針來返回一個整數嗎?
int f(int *x)
{
*x = 5;
return *x;
}
int main()
{
int * y = 0;
int z = f(y);
}
爲什麼此代碼會給我一個運行時錯誤?你可以通過解引用指針來返回一個整數嗎?
爲什麼這段代碼給我一個運行時錯誤?
由於y
是NULL
指針,其在f()
解引用。請注意,取消引用NULL
指針是未定義的行爲。
你可以通過解引用指針來返回一個整數嗎?
是的,假設指針指向有效的int
。例如:
int main()
{
int y = 0;
int z = f(&y);
}
如果指針指向某個有效的內存,則可以。在你的情況下,你是dereferencing a NULL (0x00
) pointer,這是undefined behavior(又名UB)。這一點,例如,做工精細:
int f(int *x)
{
*x = 5;
return *x;
}
int main()
{
int value = 1986;
int *y = &value; // Point to something valid.
int z = f(y);
}
因爲int *y = 0;
後,y
是一個指針,它指向什麼(指向地址0
)。 您的代碼應該是這樣的:
int * y = new int;
*y = 0;
int z = f(y);
// ...
delete y;
或
int y = 0;
int z = f(&y);
要設置指針y
到0
這使得它的NULL
指針:
int * y = 0;
,然後你正在嘗試執行間接對指針在f()
這裏:
*x = 5;
^
和在隨後的線,這是undefined behavior。如果我們看一下draft C++ standard部分8.3.2
參考款說:
[...]注:尤其是空引用不能在一個明確的程序存在,因爲只有這樣才能創建這樣一個引用就是將它綁定到通過空指針間接獲得的「對象」,這會導致未定義的行爲。 [...]
檢查指針之前取消引用,並始終指定錯誤行爲:
int f(int *x)
{
if (x)
{
// do something with x
}
else
{
// do something else in case null pointer
}
}
取消對NULL指針得到一個空指針異常,如你的情況。
僅僅因爲指針不是NULL並不意味着它指向一個有效的對象。 – hmjd 2013-03-18 14:48:58
這是真的。儘管如此,盡你所能來驗證你的論點。 – 2013-03-18 14:49:31
總是有這樣的事情做得過分。我編輯了我的答案,不鼓勵這種行爲。 – 2013-03-18 14:52:43
爲什麼「技術上」?這是未定義的行爲,簡單明瞭。 – 2013-03-18 14:45:31
@KeithThompson,他特別問他爲什麼會得到一個運行時錯誤,這將是原因,但不保證會導致運行時錯誤。但是,我會刪除「技術上」,因爲它沒有用處。 – hmjd 2013-03-18 14:46:23
謝謝!我最近纔開始學習C++。仍在學習交易的技巧。 – user2182790 2013-03-18 14:46:49