15

这是代码(有效的 C 和 C++)

#include <stdio.h>

int main() {
    printf("asfd");
    // LINE 1
    return 0;
}

如果在第 1 行中我输入了 segfaulting 表达式,程序就会崩溃而不打印任何东西(如预期的那样)。

但是为什么上面的代码打印“asdf”并且在没有刷新缓冲区的情况下不退出?引擎盖下是什么,为什么它会按预期工作?

4

3 回答 3

22

这是通过 C++ 语言规范中的这两个部分完成的:

[基本.start.main]

中的 return 语句main具有离开主函数并exit以返回值作为参数进行调用的效果。

[lib.support.start.term]

该函数exit在本国际标准中具有其他行为:

  • ...
  • 接下来,刷新所有具有未写入缓冲数据的打开的 C 流。
  • ...
于 2013-04-09T20:22:00.113 回答
4

通常,返回 frommain不是程序的结束,也不是main开始的入口。

通常,为您的程序创建最终可执行文件的链接器会将某个位置(可能命名为start)标记为开始执行的位置。当操作系统加载你的程序并开始执行它时,它会在这个地方开始执行。那里有设置环境的代码:创建堆栈,设置流状态等。然后这段代码调用main.

返回时main,它返回到这个特殊代码。然后,该代码执行 C 或 C++ 程序结束时所需的各种清理工作,如本答案中所述。

如果一个程序突然终止,这个最终代码可能不会被执行。

于 2013-04-09T21:06:41.003 回答
2

main()退出时,所有打开的流都将关闭...以包含stdout. 关闭打开的流会刷新stdout,并且您写入缓冲区的内容会在有或没有换行符的情况下提交。

于 2013-04-09T20:20:42.123 回答