Хитрость в том, что вы не вставили перевод строки:
printf("last print");
Стандартная библиотека ввода-вывода будет буферизовать вывод, пока не увидит новую строку для печати. Вывод на терминалы обычно буферизуется; вероятно, gdb
запускает программу так, как будто она подключена к терминалу, поэтому она печатает предыдущие строки с символом \n
, когда они печатаются.
На самом деле равно в полученном вами выходе:
... ctr = 2last print[In ...
Стандартная библиотека ввода-вывода сбрасывает все свои входные потоки непосредственно перед выходом - с помощью обработчика выхода atexit(3)
, так что вывод сбрасывается непосредственно перед тем, как программа просит операционную систему разорвать свою память и сообщите родителю, что он мертв.