2011-03-21 44 views
3

可能重複:
Can a pointer (address) ever be negative?爲-1有效的指針地址

我考慮初始化一個結構到所有-1s與memset的(因爲它使用 無符號數和零是一個有效的值)。

是-1是一個有效的指針地址?我的想法還有其他問題嗎? 注意:平臺是linux/gcc/x86

P.S.我試圖初始化一個不是所有指針的結構,其中0對所有無效的類似值都有效,所以我可以選擇在一個函數中進行部分初始化,並在稍後將非初始化字段初始化爲默認值。如果在c中有這樣的模式/策略?

+1

@Naveen:與OP使用memset時不重複。 – 2011-03-21 11:46:42

回答

3

作爲指針的-1的解釋是依賴於體系結構,因此不可靠。

一般而言,memset旨在設置字節,而不是指針。 C並不保證如何將各個字節組合起來形成一個指針。即使你的解決方案有效,你也必須記錄它的工作原理和原理。

更好的主意,當NULL是一個有效的值,是將所有指針設置爲適當類型的標記。因此,如果您的結構有一個字段int *ip

static const int sentineli; 

// in the initialization: 
foo->ip = (int *)&sentineli; 

然後與該值進行比較。這是自我記錄。

+0

他們的字段並不全是指針 – 2011-03-21 11:50:23

+1

@Roman:用memset初始化指針仍然是一個非常糟糕的主意。與'memset'一起使用的 – 2011-03-21 11:53:30

1

負數通常以實現定義的方式存儲。一些實現使用1的補碼來存儲負數,其他的使用2的補碼。

並且我的想法還有其他問題嗎?

該代碼可能無法跨實現移植。

+0

將始終爲全1位模式,因爲-1被轉換爲'unsigned char'。當然,這並不一定與整數值-1相匹配,並且在C中不存在指針值-1。 – 2011-03-21 13:28:04

3

通常,唯一有效的指針值爲NULL,指向現有對象的開始,內部和後面的指針。還要注意的是,NULL不一定必須表示爲具有零:s的位模式。

在某些體系結構中,-1是合法的指針值。一些微控制器在內存的低部分具有RAM,而在上部分具有隻讀內存(如閃存)。

0

在任何真實世界的桌面或服務器系統上,投射到指針的-1相當於全位1指針表示,並且它不是有效的指針。假設指針加法是作爲整數加法發生的,如果指針p具有全比特-1表示,則p+1將是全比特零指針,其在現實世界中是空指針。

儘管如此,標準並沒有保證這一點。