![](/img/trans.png)
[英]What is the difference between the definitions “int main (void)” and “int main (int argc, char *argv[])” and when to use which?
[英]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) { /* ... */ }
或带有两个参数(尽管可以使用任何名称,但在此处称为
argc
和argv
,因为它们是声明它们的函数的局部名称):
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
的情况下, T
为char *
。
如果T
是R [M]
的数组类型,则R a[N][M]
和R a[][M]
等效于R (*a)[M]
; 他们声明a
作为指向R
数组的指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.