我有两种不同版本的代码,它们使用C编程语言中的char数组。
第一版:
int main(int argc, char *argv[]) {
return 0;
}
第二个版本:
int main(int argc, char *argv) {
return 0;
}
所有代码编译时都没有警告或错误,因此这些代码之间有什么区别吗?
答案 0 :(得分:5)
来自C标准#5.1.2.2.1p1
1在程序启动时调用的函数称为main。该实现没有为此函数声明任何原型。它应使用返回类型int且没有参数来定义:
int main(void) { /* ... */ }
或具有两个参数(尽管可以使用任何名称,但在此处称为argc和argv,因为它们是声明它们的函数的局部名称):
int main(int argc, char *argv[]) { /* ... */ }
或等效形式; 10)或以其他一些实现定义的方式。
根据标准,您的第二个版本不正确:
int main(int argc, char *argv) {
return 0;
}
使用gcc
编译器进行编译时,出现以下错误消息:
prg.c:1:5: error: second parameter of 'main' (argument array) must be of type 'char **'
答案 1 :(得分:-1)
对于main
函数,最好将第二个参数argv
定义为*argv[]
或**argv
。
如果您的程序不处理任何“命令行参数”,则此参数将无用。但是,如果需要它(例如-lR
中的ls -lR
字符串),您可能会注意到参数 s 将成为二维char数组,或者我们说(参数)字符串 s 的数组。由于C中的“字符串”在不同情况下可以为char*
或char[]
,因此我们可以将二维字符数组表示为char *argv[]
或char **argv
。
此外,如果您使用gcc -Wall
,则第二个程序将产生警告,指出main
的第二个参数的类型应为char**
。