2016-03-24 62 views
-3

我將從我所知道的開始:C標準要求NULL(以某種方式)指向無效的指針,理論上它不指向任何東西。因此,例如malloc()應該永遠不會返回一個NULL指針,如果發生錯誤。我知道NULL通常表示爲((void*)0),並且編譯器將此指針零轉換爲實現定義的地址,該地址符合符號空指針的理論要求(意思是地址本身無法訪問)。C的限制地址/指針

現在讓我們假設我需要另一個NULL(讓它稱爲NULL2),它具有與NULL相同的確切特性,但它也可以與NULL(NULL!= NULL2)區分開來。從我所瞭解的內存(這不是很多)中,NULL指針通常指向一段內存中禁止訪問的地址。所以我的意思是,通常有一整段內存不僅僅限於一個地址。所以我們可以說我將NULL2定義爲NULL + 1(我知道這可能會讓你感到畏縮或者可能會有點堵嘴),理論上NULL2(就像我剛剛定義的那樣)也是無法訪問的(就像NULL無法訪問一樣)?

我希望答案完全是平臺特定的,所以例子幾乎是我所期待的。但更普遍的是,還有其他的指針地址被ISO-C標準定義爲無效(或不可達或其他),與NULL相同。所有地址無效(或限制)以及無效的原因的一般性解釋也會有所幫助。如果你覺得有必要問我「爲什麼要愛上帝,我需要這樣做」,我的回答是我不需要做任何事情;它只是一個假設的問題。

+0

將段落中的文字。 –

+0

請閱讀[問]。 – OldProgrammer

+0

好吧,假設,如果你想要這個,你應該創建你自己的語言與這個特定的行爲。在C中你不能,而且如果你不能代表不同的東西,你就不應該定義兩種不同類型的無效指針 –

回答

0

不,NULL代表零。 是的,使用NULL + 1行爲應該是平臺特定的。但是,我懷疑地址0x0001通常可用於程序員,所以它可以被認爲是一個很好的不可用地址。

在你的地方,我會做一些像這樣的:

#define NULL2 null2() 
void *null2() 
{ 
    static char pointing_me_is_invalid; 
    return &pointing_me_is_invalid; 
} 
0

恐怕只是做NULL + 1調用在C.不確定的行爲

N1570說,在6.5.6加法運算符:(重點礦)

2對於另外,任一兩個操作數應具有算術類型,或 一個操作數須爲指針到交流完整對象類型和 其他應具有整數類型。 (增加等效於將 1)

我不認爲NULL保證指向一個完整的對象類型。例如,((void *)0)沒有。

我仍然不明白爲什麼你需要另一個不可達的地址常量,即使它只是一個假設的問題。如果確實存在這樣一個常數,它就不能攜帶。因此,只需使用0NULL,然後您的編譯器將負責其餘部分。