为什么我们需要argc而argv的末尾总是空?

看来argv[argc]总是为NULL ,所以我认为我们可以在没有argc情况下遍历参数列表。 一个while循环将做到这一点。

如果在argv结尾处总是有一个NULL ,为什么我们需要一个argc

是的, argv[argc]==NULL保证。 见C11 5.1.2.2.1程序启动 (我强调)

如果声明了,主函数的参数应该遵守以下约束条件:

argc的值应该是非负的。 argv [argc]应该是一个空指针。

因此提供argc并不重要,但仍然有用。 除此之外,它允许快速检查正确的参数数目已被传递。

编辑:该问题已被修改,以包括C ++。 n3337草稿3.6.1主要function

2 … argc应该是从运行程序的环境传递给程序的参数的数量。 …. argc的值应该是非负的。 argv [argc]的值应为0

是的, argv[argc]保证是一个空指针。 argc是为了方便使用的。

引用C99理由的官方解释,注意单词冗余检查

国际标准的基本原理 – 编程语言 – C§5.1.2.2.1 程序启动

argcargv作为main参数的规范认可了大量的先前的实践。 argv[argc]必须是一个空指针,以便在列表的末尾提供冗余检查,同样也是基于惯例。

这是历史原因,并与旧代码兼容。 最初,并不能保证存在一个空指针作为argv数组的最后一个元素。 但argc 一直存在。

我们“需要”它,因为它是各种标准所要求的。

我们可以完全忽略这个值,但是因为它是main第一个参数,所以我们必须在参数列表中有它。 在C ++(可能是非标准的C语言)中,可以省略参数名称,就像这个C ++代码片段(容易转换为C)一样:

 #include <stdio.h> // C-compatible include, guarantees puts in global namespace // program will print contents of argv, one item per line, starting from argv[0] int main(int /*argc*/, char *argv[]) { // uncomment argc for C //(void)argc; // uncomment statement for C for (int i=0; argv[i]; ++i) { puts(argv[i]); } return 0; } 

在标准C中,通常的警告设置,未使用的参数会生成警告,可以通过像(void)argc;这样的语句来修复(void)argc; 这会导致名称被使用而不生成任何代码。

argc很高兴,因为否则许多程序将需要走参数来计算。 另外,在许多具有长度的数组的编程语言中,没有任何argc参数,只有一个数组。