我试图找出以这种格式将argv变量传递给main的结果。 main(int argc,char const * argv)。
我知道使用它的正确方法是main(int argc,char const ** argv) 或main(int argc,char const * argv [])。
这是我的代码段,
#include <stdio.h>
int
main( int argc, char const * argv ) {
for( int i = 0; i < argc; ++i ) {
printf("%s\n", argv[i]);
}
}
这是输出,
$ ./a.exe
...
$ ./a.exe 1
2
...
$ ./a.exe 1 2
2
...
它是从任何argv点获取的吗?为什么它甚至在达到argc之前终止。
答案 0 :(得分:2)
它导致undefined behavior作为提供的类型,并且期望的类型不匹配,因此这是一个明显的约束违规情况。
引用C11
,第章章节§5.1.2.2.1/ p2,(强调我的)
如果声明它们,主函数的参数应遵循以下内容 约束:
...
如果
argc
的值大于零,则数组成员argv[0]
通过argv[argc-1]
包含的内容应包含指向字符串的指针 程序启动前主机环境实现定义的值
考虑到数组衰减属性,您可以重新编写char * argv[]
char **argv
注意,但char *[]
和char *
不兼容无论如何。
注:
引用C11
,章节§5.1.2.2.1,脚注10)
因此,
int
可以替换为定义为int
的typedef名称,或者argv
的类型可以写为char ** argv
,等等。