Вот код (действительный C и C ++)
#include <stdio.h>
int main() {
printf("asfd");
// LINE 1
return 0;
}
Если в строке 1 я добавлю выражение segfaulting, программа просто рухнет, ничего не печатая (как и ожидалось).
Но почему вышеприведенный код печатает «asdf» и не завершается без очистки буфера? Что находится под капотом и почему он работает как положено?
Это достигается этими двумя разделами в спецификации языка C ++:
[Basic.start.main]
Заявление о возврате в
main
имеет эффект выхода из основной функции и вызоваexit
с возвращаемым значением в качестве аргумента.
а также
[Lib.support.start.term]
Функция
exit
имеет дополнительное поведение в этом международном стандарте:
- …
- Затем все открытые потоки C с неписанными буферизованными данными сбрасываются.
- …
Как правило, возврат из main
это не конец вашей программы и не вход в main
начало.
Обычно компоновщик, который создает конечный исполняемый файл для вашей программы, отмечает некоторое местоположение, возможно, с именем start
, как место, где начинается казнь. Когда операционная система загружает вашу программу и начинает выполнять ее, она начинает выполнение с этого места. Там есть код, который устанавливает среду: создает стек, устанавливает состояния потока и так далее. Тогда этот код вызывает main
,
когда main
возвращается, он возвращается к этому специальному коду. Затем этот код выполняет различную работу по очистке, которая требуется в конце программы на C или C ++, как описано в этот ответ.
Если программа внезапно завершается, этот окончательный код может не выполняться.
когда main()
выходы, все открытые потоки закрыты … включить stdout
, Закрытие открытого потока stdout
и то, что вы записали в буфер, передается с новой строкой или без нее.