链表末尾的尾部指针为null(0(似乎很常见。
如果我想要两个可能不同的";尾巴";?
我的用例是一个支持二的补码的大整数表示:我希望有一个对应于"这个数字的其余部分是零";以及";这个数字的其余部分是"1";,在那里我可以通过执行指针相等来区分它们。
这似乎应该足够普遍,可以有标准的做法,但很难想清楚该搜索什么。我们只得到一个";被禁止的";指针值(意外取消引用时会出现有用的ish错误(。
选项似乎包括:
- 使用任意的秒值(如1或0xdeadbeef(。这看起来很邪恶。首先,我想它需要对齐?此外,如果malloc碰巧在同一地址分配了一个真正的链表单元格,我会有一些模糊的错误。是否有保证malloc不会使用的内存区域
- 使用伪非零大小调用malloc。这似乎更明智,但理想情况下,我会让指针值为const,而不是需要初始化
- 取任意对象的地址,例如文件中定义的函数。这看起来很邪恶,但似乎没有任何实际的缺点(假设它会起作用(
给定一些ListItem
类型和一个想要有一个ListItem *
值作为sentinel(另请参阅sentinel节点(的对象,我们可以简单地定义一个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
提供了相同的地址,但考虑到它们的类型不同,这不太可能成为问题。