1
#include <stdio.h>

int main(int argc, char* argv[]){
  printf("argc: %d\n",argc);
  for(int i=0;i<sizeof(argv);i++){
    printf("argv[%d] %s\n",i,argv[i]);
  }
  return(0);
}

在 GNU/linux 发行版下的 gnome 终端下使用它时编译得很好

printTest one\ two three
argc: 3
argv[0] /data/local/tmp/printTest
argv[1] one two
argv[2] three
argv[3] (null)

我故意留下一个空白空间,而 argv 似乎表现得很奇怪。

这种行为正常吗?那是什么 null ?为什么 argv 创建一个空指针而不是仅仅提供一个较短的数组?

4

4 回答 4

8

sizeof(argv)是没有意义的——它是一个指针的大小(在你的平台上是 4 个),在这种情况下,它恰好比值的数量多一argv

请改用argc此处。

于 2012-10-13T19:11:13.567 回答
4

这种行为正常吗?

是的,一点没错。one\ two指定您希望这是一个参数。

那是什么 null ?为什么 argv 创建一个空指针而不是仅仅提供一个较短的数组?

它显示了数组的结尾,并且是标准要求的。它可以遍历所有不使用的参数argc,例如:

while (*++argv) {
    // do something
}

但是正如duskwuff 指出的那样,您的代码中也有错误。

于 2012-10-13T19:16:16.557 回答
2

您不应该使用sizeof(argv):您只会获得系统上指针的大小,而不是参数的数量。

另请注意,这argv[argc]NULL根据规范:无论您的转义空间或参数数量如何,都会有一个NULLat 。argv[argc]

5.1.2.2.1/2开始:

argv[argc] 应该是一个空指针。

于 2012-10-13T19:16:33.803 回答
1

这是为了支持典型的 C-ish 习惯用法:

for (char** arg = argv + 1; *arg; arg++)
{
    // process next arg

如您所见,argv它是以 0 结尾的字符串数组。

将输入拆分为单独的参数是由 shell 完成的,语言没有定义它。

于 2012-10-13T19:16:57.283 回答