main()在运行时异常返回什么?

时间:2019-04-16 08:06:12

标签: c exception main

当程序遇到运行时异常(例如分段错误)时,C int main()函数返回什么?

在寻找答案时,我遇到了许多有关what main() should return, like this one的讨论/帖子。

2 个答案:

答案 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;
}

实际上,当您在机器代码中调用函数时,您会简单地将代码所在位置的地址存储在特定位置,然后跳转到要执行的代码。该代码可能对某些包含要传递给该函数的参数的寄存器有一些假设。如果您忘记加载那些寄存器,则代码将使用那里的任何内容,而不会知道您忘记发送参数。函数结束时也会发生同样的事情。当机器代码命中某个返回指令时,就会发生这种情况。该指令将跳回到我们称之为的位置。如果之后的代码希望函数返回某些内容,则基本上只是希望函数将其返回值存储在正确的位置,然后在不知道是否是这种情况的情况下读取它。

因此,简短的答案是它可能包含随机值或由操作系统决定的值。