Ho trovato la spiegazione al problema:

La printf scrive su stdout, che è line-buffered. Ciò vuol dire che i caratteri vengono mantenuti in un buffer interno, fino a quando una riga è completa (il fine riga è il carattere '\n'). Quindi: nel momento in cui si chiama la fork, sia il processo padre che il processo figlio ricevono una copia esatta di tutte le variabili, compreso il buffer di stdout e ciò che si trova dentro.

Visto che mi trovo, come si fa a sincronizzare i processi?
In particolare io vorrei che il processo padre non termini prima dei fili. Ho uilizzato subito dopo la fork l'istruzione

wait(...)

che mette in attesa un processo finche non è terminato uno dei figli, quindi il padre dovrebe attendere la terminazione dell'unico figlio generato nel ciclo for prima di andare avanti generando un altro figlio. Pero quello che accade è che il padre termina comunque prima. Come dovrei fare allora per realizzare quello che voglio?