NULL指针作为数组末尾的标记

我阅读了Kernigan&Ritchie撰写的第二版“C编程语言”第6.3段。

一些结构:

struct key { char *word; int count; } keytab[NKEYS] { { "auto", 0 }, { "break", 0 }, { "case", 0 }, { "char", 0 }, { "const", 0 }, { "continue", 0 } }; 

作者写了这篇文章:

数量NKEYS是keytab中的关键字数量。 虽然我们可以手工计算,但是通过机器来完成它会更加容易和安全,特别是如果列表可能会发生变化。 一种可能性是使用空指针终止初始化程序列表,然后沿keytab循环直到找到结尾。

如果枚举只包含指针,那么一切都会很清楚:

 struct key { char *word; char *description; } keytab[NKEYS] { { "auto", "" }, { "break", "" }, { "case", "" }, { "char", "" }, { "const", "" }, { "continue", "" } { NULL, NULL} }; 

但是每条记录都没有指针,但也有int 。 如果我理解作者,那么最后一条记录必须如下:

 { NULL, ? } 

不指针怎么样?

如何为不包含指针的枚举解决它? 例如:

  enum myEnum { int index; inr count; double value; } myVariable[] { {0,0,0}, {0,0,0}, {0,0,0}, {0,0,0}, {?,?,?} }; 

谢谢。

关键是通过将最后一条记录设置为NULL,您可以在迭代时轻松识别数组的结尾。

如果你没有指针,你仍然可以认为某些“特殊”值表示结束,也许countindex在你的应用程序中永远不会是负数,所以看到一个小于0的值可能是你的标记可以用来可靠地找到目的。 末端标志物的另一种常见选择可能是~0 (即全1)。

或者你可以用它传递一个size_t

您可以创建特殊的枚举值(例如, -1 ),您可以将其用作最后一个条目的标记。