我考慮初始化一個結構到所有-1s與memset的(因爲它使用 無符號數和零是一個有效的值)。
是-1是一個有效的指針地址?我的想法還有其他問題嗎? 注意:平臺是linux/gcc/x86
P.S.我試圖初始化一個不是所有指針的結構,其中0對所有無效的類似值都有效,所以我可以選擇在一個函數中進行部分初始化,並在稍後將非初始化字段初始化爲默認值。如果在c中有這樣的模式/策略?
我考慮初始化一個結構到所有-1s與memset的(因爲它使用 無符號數和零是一個有效的值)。
是-1是一個有效的指針地址?我的想法還有其他問題嗎? 注意:平臺是linux/gcc/x86
P.S.我試圖初始化一個不是所有指針的結構,其中0對所有無效的類似值都有效,所以我可以選擇在一個函數中進行部分初始化,並在稍後將非初始化字段初始化爲默認值。如果在c中有這樣的模式/策略?
作爲指針的-1
的解釋是依賴於體系結構,因此不可靠。
一般而言,memset
旨在設置字節,而不是指針。 C並不保證如何將各個字節組合起來形成一個指針。即使你的解決方案有效,你也必須記錄它的工作原理和原理。
更好的主意,當NULL
是一個有效的值,是將所有指針設置爲適當類型的標記。因此,如果您的結構有一個字段int *ip
:
static const int sentineli;
// in the initialization:
foo->ip = (int *)&sentineli;
然後與該值進行比較。這是自我記錄。
他們的字段並不全是指針 – 2011-03-21 11:50:23
@Roman:用memset初始化指針仍然是一個非常糟糕的主意。與'memset'一起使用的 – 2011-03-21 11:53:30
負數通常以實現定義的方式存儲。一些實現使用1的補碼來存儲負數,其他的使用2的補碼。
並且我的想法還有其他問題嗎?
該代碼可能無法跨實現移植。
將始終爲全1位模式,因爲-1被轉換爲'unsigned char'。當然,這並不一定與整數值-1相匹配,並且在C中不存在指針值-1。 – 2011-03-21 13:28:04
通常,唯一有效的指針值爲NULL,指向現有對象的開始,內部和後面的指針。還要注意的是,NULL不一定必須表示爲具有零:s的位模式。
在某些體系結構中,-1是合法的指針值。一些微控制器在內存的低部分具有RAM,而在上部分具有隻讀內存(如閃存)。
在任何真實世界的桌面或服務器系統上,投射到指針的-1相當於全位1指針表示,並且它不是有效的指針。假設指針加法是作爲整數加法發生的,如果指針p
具有全比特-1表示,則p+1
將是全比特零指針,其在現實世界中是空指針。
儘管如此,標準並沒有保證這一點。
@Naveen:與OP使用memset時不重複。 – 2011-03-21 11:46:42