字符串(命令行)如何存储在char ** argv和int * argv中?

时间:2016-01-11 15:58:31

标签: c pointers command-line-arguments main

第一个片段:

#include<stdio.h>
int main(int argc, char **argv)
{
int i;
for(i=1; i<argc; i++)
    printf("%s\n", argv[i]);
return 0;
}

加载时间输入:

  

./ a.out devang samir

输出:

  

devang
     萨米尔

第二个片段:

#include<stdio.h>
int main(int argc, int *argv)
{
int i;
for(i=1; i<argc; i++)
    printf("%s\n", argv[i]);
return 0;
}

加载时间输入:

  

./ a.out devang samir

输出:

  

devang
     萨米尔

在这两种情况下,我输出相同,但为什么?

  • 在第一种情况下,字符串(命令行)如何存储在char ** argv?
  • 在第二种情况下,字符串(命令行)如何存储在int * argv ...?

1 个答案:

答案 0 :(得分:2)

C11标准在第5.1.2.2.1章中指定了main()的函数签名

  

程序启动时调用的函数名为main。实施宣布否   这个功能的原型。它应定义为返回类型int且没有   参数:

int main(void) { /* ... */ }
     

或有两个参数(此处称为argcargv,但可能有任何名称   使用,因为它们是声明它们的函数的本地函数):

int main(int argc, char *argv[]) { /* ... */ }
     

或同等的; [...]

关于约束,

  

如果argc的值大于零,则数组成员argv[0]通过   argv[argc-1]包含字符串的指针,[...]

然后,在你的第二个案例中,

 int main(int argc, int *argv)

char*int(对于argv[n],一般而言)完全是不同的类型(即不兼容的类型),您的第二个程序会调用undefined behavior

详细说明,如果没有原型的函数,调用时传递给函数的参数应该完全匹配预期参数的类型。

引用标准,章节§6.5.2.2

  

[...]如果函数定义的类型不包含原型,则类型为   促销后的参数与之后的参数不兼容   促销,行为未定义。