数组末尾的NULL的用途?

时间:2015-03-27 19:53:27

标签: c

我从Fedora's Defensive Coding手册中找到了此代码。他们有这段代码:

static const char *const string_list[] = {
  "first",
  "second",
  "third",
  NULL
};

将NULL放在数组的末尾是什么意思?当然,数组的大小将始终是已知的,因为它是全局范围内的数组。

3 个答案:

答案 0 :(得分:3)

这是一个所谓的sentinel value。它允许您使用任何内部检查方法,使其更适合您当前的方法。

Aren你已经解除引用了吗?检查NULL然后,应该不需要跟踪索引。你在数吗?然后检查计数变量。

在你编写的大多数程序中最流行的用法是:传递给char **argv的参数向量(main)总是有一个NULL作为最后一个成员,尽管从技术上来说int argc就足够了。

答案 1 :(得分:2)

元素的数量 已知

elems = sizeof(string_list) / sizeof(char*);

但它更干净(并且更通用)测试NULL值,因为无论如何你将处理字符串指针。

请注意链接的标题:“defensive”。在更一般的情况下,数组可能不满,因此依赖于它的大小是不安全的 - 可能存在未初始化的指针。

答案 2 :(得分:1)

这允许您使用指针迭代列表而不跟踪索引:

for (const char * const * string = string_list; *string; string++)
    do_something(*string);

没有const,为清晰起见:

for (char **string = string_list; *string; string++)
    do_something(*string);

这与字符串本身经常使用的技术相同:

for (char *c = string; *c; c++)
    process_char(c);

您也可以将列表传递给函数,而不必传递长度。

它也可以很容易地引用数组的子序列,只要它在最后。