繁体   English   中英

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

[英]the C, what does “void main (int argc, char *argv[0])”, note the zero in argv

谈到C
我知道

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

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

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

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

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

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

是等效的。

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

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

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

并且仍然可以按照您的期望工作。 对于任何阅读代码的人来说,这可能会造成混乱。 但这是完全有效的。

相关文章: 什么是阵列衰减?

首先 ,谈到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;
}

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

argv的情况下, Tchar *

如果TR [M]的数组类型,则R a[N][M]R a[][M]等效于R (*a)[M] 他们声明a作为指向R数组的指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM