c语言 - 替代"null"值



链表末尾的尾部指针为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;

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

相关内容

  • 没有找到相关文章

最新更新