当程序遇到运行时异常(例如分段错误)时,Cint main()
函数会返回什么?
在寻找答案时,我点击了许多关于main()
应该返回什么的讨论/帖子,比如这个。
如果程序崩溃,它(main
函数)不会返回。如果程序崩溃,那么操作系统就会杀死该程序,因此该程序不再运行,其中包括main
功能。不运行的程序无法自行返回任何内容。"返回"到运行环境的内容取决于操作系统,操作系统在程序之后接管了操作系统。
返回的任何内容都由操作系统处理。对于POSIX系统,被信号杀死的进程(如SIGSEGV
,分段错误)操作系统将返回128
加上信号编号。这记录在例如此waitpid
参考页面(以及其中的链接)中。
对于 Windows,它通常报告为一个神秘的长整型值(通常是0x80000000
值加上其他标志和数据)。
对于不处理崩溃的较旧或更原始的操作系统,"返回"的值通常是崩溃时恰好在"返回值"寄存器中或堆栈顶部的值。
如果程序崩溃,它不会返回任何值。这将由操作系统来处理,但 C 标准没有说明应该发生什么。调用程序时,行为可以这样描述:
int mainWrapper() {
int ret;
try {
ret = main();
}
catch(Exception e) {
ret = // Some value that may or may not depend on what
// happened and might even be random
}
return ret;
}
当你在机器代码中调用一个函数时,现实中发生的事情是,你只是简单地存储你在代码中某个位置的地址,然后跳转到你想要执行的代码。该代码可能对某些寄存器有一些假设,这些寄存器包含要传递给该函数的参数。如果您忘记加载这些寄存器,代码将使用那里的任何内容,而不知道您忘记发送参数。当函数结束时,同样的事情也会发生。当机器代码命中某个返回指令时,就会发生这种情况。此指令将跳回到我们调用它的位置。如果之后的代码期望函数返回一些东西,它基本上只是希望函数将其返回值存储在正确的位置,然后在不知道是否是这种情况的情况下读取它。
因此,简短的回答是它可能包含随机值或由操作系统决定的内容。