printf записывается в поток stdout, который объявлен в stdio.h. Он открывается при первом прикосновении к одному из стандартных потоков: stdin, stdout, stderr. Стандартные потоки stdin, stdout и stderr - это макросы, которые вызывают функцию библиотеки stdio, которая открывает потоки и возвращает массив этих потоков. Определения макросов индексируют массив, чтобы получить правильный поток. Если в приложении нет консоли, вывод отправляется на «нулевое» устройство.