當刪除在使用線性探測你要表示一個數值,一旦在該單元的存在,但可以在搜索過程中被忽略的哈希表中的單元格。解決這個問題的最簡單的方法是添加另一個變量來存儲這些信息,但是如果保證的無效內存地址是已知的並且用於表示此狀態,則可以避免使用該額外變量。
問:
我認爲,因爲0是保證無效的內存地址(往往不是),必須有不只是空了。所以我的問題是,C是否爲任何其他保證的無效內存地址提供了一個標準的宏?
當刪除在使用線性探測你要表示一個數值,一旦在該單元的存在,但可以在搜索過程中被忽略的哈希表中的單元格。解決這個問題的最簡單的方法是添加另一個變量來存儲這些信息,但是如果保證的無效內存地址是已知的並且用於表示此狀態,則可以避免使用該額外變量。
問:
我認爲,因爲0是保證無效的內存地址(往往不是),必須有不只是空了。所以我的問題是,C是否爲任何其他保證的無效內存地址提供了一個標準的宏?
從技術上講,NULL
不保證是無效的。它僅保證不會是任何對象的(C11 6.3.2.3:3)地址:
用值0,或這樣的表達 鑄造void *類型的整數常量表達式,被稱爲空指針常量(66)。如果空指針常量被轉換爲指針類型,則結果爲 的指針(稱爲空指針)保證將不等於的指針與指向任何對象或函數的指針進行比較。
(66)宏NULL被定義(和其他標題)作爲空指針常量
您的使用不需要特殊的地址值無效兩種:很明顯,你不訪問除非您的程序的正常行爲包含了違規行爲。
因此,只要這些對象的地址不打算成爲單元的正常內容的一部分,就可以使用任意數量的對象的地址。
例如,對於指針之間轉換的對象保留表示的架構,你可以使用:
char a, b, …;
#define NULL1 (&a)
#define NULL2 (&b)
…
這不是一個標準的宏(我懷疑它存在),但它明確地解決了這個問題,謝謝。 – MetaDark 2014-11-06 15:15:05
嚴格來說,NULL
不需要在運行時在數值上爲零。 C在指針上下文中將0
和NULL
轉換爲實現定義的無效地址。該地址通常在數值上爲零,但這不是由C標準保證的。就我所知,C本身不提供任何與NULL
不同的無效地址。
您也可以創建自己的「無效」的地址指針:
const void* const SOME_MARKER = (void*) &x;
如果您確定x
(或其地址)永遠不會在您想使用的地方實際使用SOME_MARKER
您應該是安全的並且100%便攜。
從技術上講,地址0 *可能是一個有效的地址,例如,在嵌入式系統上。但是,爲了回答你的問題,C將'NULL'作爲指向「null」的指針(它不一定是'0'),就這些了。 – 2014-11-06 14:46:22
爲什麼你需要更多? NULL是足夠的並且是唯一的。在指針值中使用額外的位是一個常見的錯誤btw,當架構改變時結束很糟糕。 – 2014-11-06 14:46:31
@JoachimPileborg我知道NULL不是嚴格的0,但我的問題是編譯器可以保證至少有一個地址,爲什麼它不能保證更多? – MetaDark 2014-11-06 14:48:42