当程序遇到运行时异常(例如分段错误)时,C int main()
函数返回什么?
在寻找答案时,我遇到了许多有关what main()
should return, like this one的讨论/帖子。
答案 0 :(得分:7)
如果程序崩溃,它(main
函数)不会返回。如果程序崩溃,则操作系统将杀死该程序,因此该程序不再运行,并且包含main
函数。不运行的程序无法自行返回任何内容。返回到运行环境的内容取决于操作系统,该操作系统已在程序之后接管。
无论返回什么,都由操作系统处理。对于POSIX系统,操作系统通过信号(例如SIGSEGV
,分段错误)终止的进程将返回128
加上信号号。这在例如this waitpid
reference page(及其链接)。
对于Windows,通常将其报告为神秘的long值(通常是值0x80000000
加上其他标志和数据)。
对于不处理崩溃的较旧或更原始的操作系统,“返回”的值通常是崩溃时在“返回值”寄存器中或堆栈顶部的值。 / p>
答案 1 :(得分:-1)
如果程序崩溃,它将不会返回任何值。这将由操作系统来处理,但是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;
}
实际上,当您在机器代码中调用函数时,您会简单地将代码所在位置的地址存储在特定位置,然后跳转到要执行的代码。该代码可能对某些包含要传递给该函数的参数的寄存器有一些假设。如果您忘记加载那些寄存器,则代码将使用那里的任何内容,而不会知道您忘记发送参数。函数结束时也会发生同样的事情。当机器代码命中某个返回指令时,就会发生这种情况。该指令将跳回到我们称之为的位置。如果之后的代码希望函数返回某些内容,则基本上只是希望函数将其返回值存储在正确的位置,然后在不知道是否是这种情况的情况下读取它。
因此,简短的答案是它可能包含随机值或由操作系统决定的值。