第一个片段:
#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
萨米尔
在这两种情况下,我输出相同,但为什么?
答案 0 :(得分:2)
C11
标准在第5.1.2.2.1章中指定了main()
的函数签名
程序启动时调用的函数名为
main
。实施宣布否 这个功能的原型。它应定义为返回类型int
且没有 参数:int main(void) { /* ... */ }
或有两个参数(此处称为
argc
和argv
,但可能有任何名称 使用,因为它们是声明它们的函数的本地函数):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
[...]如果函数定义的类型不包含原型,则类型为 促销后的参数与之后的参数不兼容 促销,行为未定义。