这是代码(有效的 C 和 C++)
#include <stdio.h>
int main() {
printf("asfd");
// LINE 1
return 0;
}
如果在第 1 行中我输入了 segfaulting 表达式,程序就会崩溃而不打印任何东西(如预期的那样)。
但是为什么上面的代码打印“asdf”并且在没有刷新缓冲区的情况下不退出?引擎盖下是什么,为什么它会按预期工作?
这是通过 C++ 语言规范中的这两个部分完成的:
[基本.start.main]
中的 return 语句
main
具有离开主函数并exit
以返回值作为参数进行调用的效果。
和
[lib.support.start.term]
该函数
exit
在本国际标准中具有其他行为:
- ...
- 接下来,刷新所有具有未写入缓冲数据的打开的 C 流。
- ...
通常,返回 frommain
不是程序的结束,也不是main
开始的入口。
通常,为您的程序创建最终可执行文件的链接器会将某个位置(可能命名为start
)标记为开始执行的位置。当操作系统加载你的程序并开始执行它时,它会在这个地方开始执行。那里有设置环境的代码:创建堆栈,设置流状态等。然后这段代码调用main
.
返回时main
,它返回到这个特殊代码。然后,该代码执行 C 或 C++ 程序结束时所需的各种清理工作,如本答案中所述。
如果一个程序突然终止,这个最终代码可能不会被执行。
main()
退出时,所有打开的流都将关闭...以包含stdout
. 关闭打开的流会刷新stdout
,并且您写入缓冲区的内容会在有或没有换行符的情况下提交。