將鏈表末尾的尾指標設為空 (0) 似乎很常見。
如果我想有兩個可能的不同“尾巴”怎么辦?
我的用例是一個支持二進制補碼的大整數表示:我希望有一個對應于“這個數字的其余部分是零”和“這個數字的其余部分是一個”的尾巴,我可以通過執行來區分它們指標相等。
看起來這應該足夠普遍以具有標準實踐,但是很難確切地想到要搜索什么。我們只得到一個“禁止的”指標值似乎有點武斷(當意外取消參考時會給出一個有用的錯誤)。
選項似乎包括:
- 使用任意第二個值(如 1 或 0xdeadbeef)。這似乎很邪惡。一方面,我想它需要對齊?此外,如果 malloc 碰巧在同一地址分配了一個真正的鏈表單元,我將遇到一些模糊的錯誤。是否有一些記憶體區域 malloc 保證不使用?
- 使用虛擬非零大小呼叫 malloc。這似乎更明智,但理想情況下,我會將指標值設為 const,而不是需要初始化。
- 取任意東西的地址,比如檔案中定義的函式。這看起來很邪惡,但似乎沒有任何實際的缺點(假設它會起作用)。
uj5u.com熱心網友回復:
給定某種ListItem型別并希望有一個ListItem *用作哨兵的值(另見哨兵節點),我們可以簡單地定義一個ListItem物件來服務于該目的:
ListItem SentinelObject;
ListItem * const SentinelValue = &SentinelObject;
static如果它們僅用于一個翻譯單元,也可以這樣做。
可以通過使用復合文字來消除命名物件:
ListItem * const SentinelValue = & (ListItem) {0};
0(如果對 的第一個成員不是合適的初始化器,則初始化器可能需要調整ListItem。)
ListItem或者,可以通過將未使用的物件與其他物件重疊來避免浪費空間:
union { SomeUsefulType SomeUsefulThing; ListItem SentinelObject; } MyUnion;
ListItem * const SentinelValue = &MyUnion.SentinelObject;
雖然這給出SomeUsefulThing了SentinelObject相同的地址,但鑒于它們具有不同的型別,這不太可能成為問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/455490.html
上一篇:多重二叉搜索樹
下一篇:有范圍限制的投射型別
