当程序遇到运行时异常(例如分段错误)时,C语言中的int main()
函数返回什么?
在寻找答案时,我遇到了许多关于main()
应该返回什么的讨论/帖子,比如这个链接。
当程序遇到运行时异常(例如分段错误)时,C语言中的int main()
函数返回什么?
在寻找答案时,我遇到了许多关于main()
应该返回什么的讨论/帖子,比如这个链接。
main
函数如果程序崩溃就不会返回结果。如果程序崩溃,那么操作系统会杀死程序,因此程序已经不再运行,包括main
函数在内。无法运行的程序没有返回值。返回给运行环境的内容取决于接管程序后的操作系统。
操作系统处理返回值。对于 POSIX 系统,被信号(如SIGSEGV
,分段错误)杀死的进程,操作系统将返回128
加上信号编号。例如在这个waitpid
参考页面(及其链接)中有相关文档。
对于 Windows,通常以一个加了其他标志和数据的神秘长整型数值(通常是值0x80000000
)报告。
对于旧版或更原始的操作系统,它们不能处理崩溃,因此“返回”的值通常是在崩溃时在“返回值”寄存器或堆栈顶部处的内容。
wait()
或waitpid()
或任何其他替代方案的手册页。 - Jonathan Leffler$?
的值将会是大于 128 的数字。Bash 使用的是 128 加上信号的编号;其他的 Shell 也可能会这么做。 - Shawnmain
函数,如果它没有运行,就根本无法返回任何东西。 - Some programmer dudeint 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;
}
当你在机器码中调用函数时,实际上发生的是你只是存储了代码中某个位置的地址,然后跳转到你想要执行的代码。该代码可能对一些寄存器包含你想要传递给该函数的参数做出一些假设。如果你忘记加载这些寄存器,代码将使用其中任何内容而不知道你忘记发送参数。当函数结束时也是同样的情况。这发生在机器码遇到某个返回指令时。该指令将跳回我们调用它的地方。如果之后的代码期望函数返回某些值,它基本上只会希望函数将其返回值存储在正确的位置,然后读取它,而不知道是否真的如此。
所以简短的答案是它可能包含随机值或由操作系统决定的某些值。