备选 "null" 值

Alternative "null" value

链表末尾的尾指针为空(0)似乎很常见。

如果我想要两个可能不同的“尾巴”怎么办?

我的用例是一个支持二进制补码的大整数表示:我想要一个尾巴对应于“这个数字的其余部分是零”和“这个数字的其余部分是一个”,我可以告诉仅通过执行指针相等将它们分开。

看起来这应该很常见,可以有标准的做法,但很难想出到底要搜索什么。我们只得到一个“禁止的”指针值似乎有点武断(当意外取消引用时会产生 useful-ish 错误)。

选项似乎包括:

给定一些 ListItem 类型和希望有一个 ListItem * 值作为 sentinel (also see sentinel node),我们可以简单地定义一个 ListItem 对象来服务它目的:

ListItem SentinelObject;
ListItem * const SentinelValue = &SentinelObject;

如果只在一个翻译单元中使用,也可以static

命名对象可以通过使用复合文字来消除:

ListItem * const SentinelValue = & (ListItem) {0};

(如果 0 不是 ListItem 的第一个成员的合适初始化器,则可能需要调整初始化器。)

或者,可以通过将未使用的 ListItem 对象与其他对象重叠来避免浪费 space:

union { SomeUsefulType SomeUsefulThing; ListItem SentinelObject; } MyUnion;
ListItem * const SentinelValue = &MyUnion.SentinelObject;

虽然这为 SomeUsefulThingSentinelObject 提供了相同的地址,但鉴于它们的类型不同,这不太可能成为问题。