以这种格式将 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 函数需要一个有效指针,该指针指向该位置的以 n​​ull 结尾的 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 )的主要内容,如果未能解决你的问题,请参考以下文章

我可以将 argv 从 main 传递给 execv 吗?

怎么使用argv

sys.exit(main(sys.argv[1:]))

除了通过 main 的 argv 之外,还有其他方法可以将用户参数传递给程序吗?

将变量传递给main方法java

有没有办法将字符串变量传递给 python .loc/.iloc?