2010-03-09 97 views
3

據我所知,在預處理階段,所有出現的NULL代碼都被0代替。然後在編譯過程中,指針上下文中所有出現的0被替換爲表示該機器上爲NULL的適當值。因此,編譯器必須知道該特定機器的NULL值。
現在,這意味着無論何時我在指針上下文中使用0,它都會被代表NULL的適當值代替,該值可能爲0,也可能不爲0.因此,如何告訴編譯器我實際上是0,而不是NULL,當我在指針上下文中使用0時?
對不起,很長的描述。糾正我,如果我錯了如何設置指向零位的指針?

回答

4

一種方式是所有位零保存到你的指針:

void* zero; 
memset(&zero, 0, sizeof(zero)); 
+1

巧妙的訣竅 - 除了在大多數系統上,當他去零時它會發出砰的一聲。除非他足夠幸運能夠在一個非零NULL的機器上工作(正如我以前; NULL是0xffffffff,所以你可以高興地做*零,看看住在地址0的東西) – pm100 2010-03-09 23:56:03

+1

對。在大多數*系統上,使用像這樣的memset是沒有意義的,因爲從簡單賦值'零= NULL'會得到相同的結果 - 零地址和空指針是相同的。但是,當零不是空指針*和*時,您需要在程序中硬編碼地址,這可能很有用。 – 2010-03-10 00:10:39

3

嗯,有實現,在C. C語言沒有提供便攜的特點特別是不移植的方法旨在將指針指向特定的數字地址。然而,顯式整數到指針轉換的「祕密」意圖其實就是:實現整數和指針之間的「自然」映射,其中「自然」通常意味着整數的數值保持不變(如果可能)將其轉換爲指針類型時。換句話說,您需要的只是一個具有0值的整數。你只需要確保這個整數沒有限定爲一個整型常量表達式,否則它將被識別爲空指針常量。 (簡而言之,您需要一個運行時間積分零點,而不是編譯時間積分零點)。

例如,這

uintptr_t i = 0; 
void *p = (void *) i; 

通常會產生一個指針指向解決0。另外,在C語言中(相對於C++)此

const uintptr_t i = 0; 
void *p = (void *) i; 

還將通常產生一指針指向解決0。雖然這

void *p = 0; /* compile-time 0 will not do */ 

將產生實現特定的空指針值。

你也可以看一下C FAQ here,它涵蓋了這個問題。