Por que o stdout está armazenando buffer?

Estou tentando aprender olibuv api e escreveu o seguinte teste:

#include <stdio.h>
#include <stdlib.h>
#include <uv.h>

void timer_cb(uv_timer_t* timer) {
    int* i = timer->data;
    --*i;
    if(*i == 0) {
       uv_timer_stop(timer);
    }
    printf("timer %d\n", *i);
    //fflush(stdout);
}

int main() {
    uv_loop_t* loop = uv_default_loop();
    uv_timer_t* timer = malloc(sizeof(uv_timer_t));
    uv_timer_init(loop, timer);
    int i = 5;
    timer->data = &i;
    uv_timer_start(timer, timer_cb, 1000, 2000);

    uv_run(loop, UV_RUN_DEFAULT);

    printf("Now quitting.\n");
    uv_close(timer, 0);
    uv_loop_close(loop);

    return 0;
}

Quando executada, nenhuma saída é exibida até que o programa termine a execução e, em seguida, toda a saída é exibida de uma só vez. Se eu descomentar offlush linha funciona como esperado, escrevendo a cada 2 segundos.

Alguém pode explicar isso para mim? Porque éstdout não liberado após a nova linha, como é explicadoaqui e em outros lugares? Por que preciso lavá-lo manualmente?

questionAnswers(3)

yourAnswerToTheQuestion