【问题标题】:Arguments of int main() in C [closed]C中int main()的参数[关闭]
【发布时间】:2021-10-24 18:24:39
【问题描述】:

请解释以下程序的输出:

#include <stdio.h>
int main(i) {
    printf("i=%d\n",i);
    return 0;
}

输出: 我=1

【问题讨论】:

  • 它不是有效的标准 C,所以你必须告诉你正在使用哪个编译器以及带有哪些非标准扩展。
  • 提示:尝试使用一些额外的参数运行您的程序 - 例如,a.out 1 2 3,看看是否有任何变化。不过,这绝对是 UB。
  • 看起来i 对应于here 描述的第二个函数签名中的argc。第一个命令行参数对应于程序名称,所以总会有一个参数,这就是i=1 的来源。但无论如何它都是毫无意义的代码,因为它不符合任何一个签名,也不符合 C99 或更高版本中指定的实现定义的签名,从而导致了这种未定义的行为。
  • K&R 语法,未指定时默认为int。哎哟!它有效,但碰巧!
  • 顺便说一句,我真的不喜欢考试中的这类问题。如果你要测试我的知识,至少问问我实际要写的东西。

标签: c output


【解决方案1】:

在托管环境中,main 至少有两个有效签名:

int main(void)

int main(int, char **)

对于第二种形式,传统的参数名称是argcargv

int main(int argc, char **argv)

如果它可以摆脱它,那么实现安排它总是最初调用是合理的

main(argc, argv)

从它的运行时启动代码,如果用户声明了

int main(void)

只需忽略“额外”参数即可。 (根据使用的函数调用机制的细节,可能会也可能不会传递“额外”参数并让它们被悄悄忽略,而不会造成任何问题——但这种情况很常见。)

在您发布的代码中,main 的声明完全不同:

int main(i)

这是一个“旧式”(K&R1) 函数定义,其中参数默认类型为 int。所以这是一样的

int main(int i)

但不清楚为什么有人会尝试用这样的一个参数声明main。它是非标准的,不能保证有效,也没有充分的理由这样做。然而,如果您在一个平台上,运行时启动代码始终传递两个参数,并且额外的参数被安静且无害地忽略,则此代码最终可能会在其i 参数中收到argc

正如评论中所建议的,如果您能够从命令行调用您的测试程序,或者以其他方式传递命令行参数,您可以尝试使用不同数量的命令行参数来调用它,看看你是否得到不同的结果。

您在不传递命令行参数时得到1 的原因是被调用程序的名称通常作为argv[0] 传递,因此argc 几乎总是至少为1。

但如前所述,这是非标准的,不能保证有效。它可以很容易地什么也不做,或者打印“Rumpelstiltskin!”,或者崩溃。

【讨论】:

  • It's not clear why you did this. -- 它出现在测试中,正如上面 cmets 中的 OP 所述。
  • @RobertHarvey 谢谢。答案已更新。我同意你关于愚蠢的测试问题的观点。
  • 鉴于我对这个问题的胡思乱想没有称其为“无效”,我想说我完全同意这是一个糟糕的测试问题。
猜你喜欢
  • 1970-01-01
  • 2015-08-12
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
  • 2016-01-05
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多