Вам было дано несколько ответов, указывающих на буферизацию выходного потока.
Хорошо это или плохо, но это далеко не единственная возможность. Ошибка сегментации означает, что ОС обнаружила, что вы сделали что-то не так, как правило, записано вне выделенной памяти. К счастью или к худшему (в основном к худшему), выполнение почти всего в такой ситуации может достаточно изменить то, что делает программа внутри, чтобы предотвратить обнаружение проблемы, по крайней мере, в то время / в ситуации, когда это было обнаружен ранее.
Например, ошибка сегмента могла быть вызвана записью через неинициализированный указатель - который, как оказалось, содержал определенное значение (возможно, небольшое целое число), потому что функция, которую вы вызывали ранее, оставила это значение в нужном месте на стек, который при вызове более поздней функции и использовании того же значения в качестве указателя, он (разумно надежно) содержал значение, которое ОС обнаружила как место, которое вам было запрещено писать. Однако вызов функции printf может означать, что вы оставляете совершенно другое значение в той точке стека, которую используете, без инициализации. Вы по-прежнему пишете куда-то, что не должны, но теперь это может быть где-то, что ОС не знает , что вы не должны писать.