我从Fedora's Defensive Coding手册中找到了此代码。他们有这段代码:
static const char *const string_list[] = {
"first",
"second",
"third",
NULL
};
将NULL放在数组的末尾是什么意思?当然,数组的大小将始终是已知的,因为它是全局范围内的数组。
答案 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);
您也可以将列表传递给函数,而不必传递长度。
它也可以很容易地引用数组的子序列,只要它在最后。