C,什么是“void main(int argc,char * argv [0])”,注意argv中的零

时间:2016-05-26 11:30:11

标签: c

说到C
我知道了

void main (int argc, char *argv[])

是将参数传递给main的正确方法 但出于好奇,我写了

void main (int argc, char *argv[1])

和程序,编译后显示与前一个完全相同的结果。
我在第二个版本中做了什么,有人可以解释一下吗?
提前谢谢。

3 个答案:

答案 0 :(得分:7)

void main (int argc, char *argv[1])

void main (int argc, char *argv[])

是等价的。

argv是一个指针(char**),main()中为其指定的大小不是argv中字符串的实际大小 - 因为数组传递给函数转换为指向其第一个元素的指针。基本上,编译器会忽略大小值。

出于同样的原因,您可以指定:

void main (int argc, char *argv[101])

它仍然可以按照您的预期运作。 阅读代码的任何人都会感到困惑。但它完全有效。

相关帖子:What is array decaying?

答案 1 :(得分:0)

首先,说到C,main()的返回类型应为int。 这来自C语言标准:

  

5.1.2.2.1程序启动

  1.程序启动时调用的函数名为main实施声明否   这个功能的原型。它应定义为返回类型int且没有   参数:

int main(void) { /* ... */ }
  

或有两个参数(此处称为argcargv,但可能有任何名称   使用,因为它们是声明它们的函数的本地):

 int main(int argc, char *argv[]) { /* ... */ }
  

或同等的;或者以其他一些实现定义的方式。

第二char *argv[]允许多个命令行参数。尽管char *argv[0]看起来很奇怪但有效,但通常会以编程方式处理命令行参数解析器。 下面是一个代码示例,演示char *argv[0]不会影响命令行参数解析:

#include <stdio.h>

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

答案 2 :(得分:0)

在函数参数声明的上下文中,T a[N]T a[]都等同于T *a;他们将a声明为指向T的指针。

如果是argvTchar *

如果T是数组类型R [M],则R a[N][M]R a[][M]等同于R (*a)[M];他们将a声明为指向R数组的指针。