2014-11-06 16 views
3

背景:C是否有更多的宏像NULL?

當刪除在使用線性探測你要表示一個數值,一旦在該單元的存在,但可以在搜索過程中被忽略的哈希表中的單元格。解決這個問題的最簡單的方法是添加另一個變量來存儲這些信息,但是如果保證的無效內存地址是已知的並且用於表示此狀態,則可以避免使用該額外變量。

問:

我認爲,因爲0是保證無效的內存地址(往往不是),必須有不只是空了。所以我的問題是,C是否爲任何其他保證的無效內存地址提供了一個標準的宏?

+0

從技術上講,地址0 *可能是一個有效的地址,例如,在嵌入式系統上。但是,爲了回答你的問題,C將'NULL'作爲指向「null」的指針(它不一定是'0'),就這些了。 – 2014-11-06 14:46:22

+1

爲什麼你需要更多? NULL是足夠的並且是唯一的。在指針值中使用額外的位是一個常見的錯誤btw,當架構改變時結束很糟糕。 – 2014-11-06 14:46:31

+0

@JoachimPileborg我知道NULL不是嚴格的0,但我的問題是編譯器可以保證至少有一個地址,爲什麼它不能保證更多? – MetaDark 2014-11-06 14:48:42

回答

7

從技術上講,NULL不保證是無效的。它僅保證不會是任何對象的(C11 6.3.2.3:3)地址:

用值0,或這樣的表達 鑄造void *類型的整數常量表達式,被稱爲空指針常量(66)。如果空指針常量被轉換爲指針類型,則結果爲 的指針(稱爲空指針)保證將不等於的指針與指向任何對象或函數的指針進行比較。

(66)宏NULL被定義(和其他標題)作爲空指針常量

您的使用不需要特殊的地址值無效兩種:很明顯,你不訪問除非您的程序的正常行爲包含了違規行爲。

因此,只要這些對象的地址不打算成爲單元的正常內容的一部分,就可以使用任意數量的對象的地址。

例如,對於指針之間轉換的對象保留表示的架構,你可以使用:

char a, b, …; 
#define NULL1 (&a) 
#define NULL2 (&b) 
… 
+0

這不是一個標準的宏(我懷疑它存在),但它明確地解決了這個問題,謝謝。 – MetaDark 2014-11-06 15:15:05

3

嚴格來說,NULL不需要在運行時在數值上爲零。 C在指針上下文中將0NULL轉換爲實現定義的無效地址。該地址通常在數值上爲零,但這不是由C標準保證的。就我所知,C本身不提供任何與NULL不同的無效地址。

3

您也可以創建自己的「無效」的地址指針:

const void* const SOME_MARKER = (void*) &x;

如果您確定x(或其地址)永遠不會在您想使用的地方實際使用SOME_MARKER您應該是安全的並且100%便攜。