以这种格式将 argv 变量传递给 main 的结果 main( int argc, char const * argv )
Posted
技术标签:
【中文标题】以这种格式将 argv 变量传递给 main 的结果 main( int argc, char const * argv )【英文标题】:result of passing argv variable to main in this format main( int argc, char const * argv ) 【发布时间】:2017-08-13 11:08:44 【问题描述】:我试图弄清楚以这种格式将 argv 变量传递给 main 会产生什么结果。 主要(int argc,char const * argv)。
我知道正确的使用方法是 main(int argc, char const **argv) 或 main( int argc, char const *argv[])。
这是我的代码sn-p,
#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 之前就终止了。
【问题讨论】:
除非您的实现允许,否则这实际上不是正确的方法。 C 标准仅将argv
指定为指向 non-const 字符串的指针缓冲区。
在您编写的代码中,argv[i]
将是一个char
值。在printf
调用中,它将被提升为int
值。但是,printf
函数需要一个有效指针,该指针指向该位置的以 null 结尾的 char
序列,而不是一些虚假的指针值。
【参考方案1】:
它导致undefined behavior 作为提供的类型和预期的类型不匹配,因此这显然是违反约束的情况。
引用C11
,章节§5.1.2.2.1/p2,(强调我的)
如果它们被声明,主函数的参数应遵循以下 约束:
...
如果
argc
的值大于零,则数组成员argv[0]
通过argv[argc-1]
inclusive 应包含 指向字符串的指针,它们是给定的 程序启动前由宿主环境定义的实现值
考虑到数组衰减属性,您可以将char * argv[]
重写为char **argv
注意,但char *[]
和char *
在任何方面都不兼容。
注意:
引用C11
,第 §5.1.2.2.1 章,脚注 10)
因此,
int
可以替换为定义为int
的 typedef 名称,或者argv
的类型可以写为char ** argv
,等等。
【讨论】:
此外,printf
调用具有未定义的行为,因为参数的类型与格式说明符字符串指定的类型不同。以上是关于以这种格式将 argv 变量传递给 main 的结果 main( int argc, char const * argv )的主要内容,如果未能解决你的问题,请参考以下文章