【问题标题】:result of passing argv variable to main in this format main( int argc, char const * argv )以这种格式将 argv 变量传递给 main 的结果 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 序列,而不是一些虚假的指针值。

标签: c command-line-arguments argv


【解决方案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 调用具有未定义的行为,因为参数的类型与格式说明符字符串指定的类型不同。
猜你喜欢
  • 2020-11-03
  • 1970-01-01
  • 2011-07-08
  • 2014-10-09
  • 2014-05-09
  • 2018-12-01
  • 2013-09-08
  • 1970-01-01
  • 2014-04-23
相关资源
最近更新 更多