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,您可以在迭代时轻松识别数组的结尾。
如果你没有指针,你仍然可以认为某些“特殊”值表示结束,也许count
和index
在你的应用程序中永远不会是负数,所以看到一个小于0的值可能是你的标记可以用来可靠地找到目的。 末端标志物的另一种常见选择可能是~0
(即全1)。
或者你可以用它传递一个size_t
。
您可以创建特殊的枚举值(例如, -1
),您可以将其用作最后一个条目的标记。