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

时间:2013-02-09 09:55:01

标签: c c89

我阅读了Kernigan&撰写的第二版“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},
          {?,?,?}
      };

谢谢。

2 个答案:

答案 0 :(得分:1)

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

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

或者你可以随身携带一个size_t

答案 1 :(得分:1)

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