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