Non c'è un vero motivo, lo scheduler decide di far proseguire il padre o il figlio in base a diversi fattori.
Però in questo caso sembra più che altro che il tuo codice non vada bene, per favore lo metteresti all'interno degli appositi tag code e identato in modo da poterlo analizzare bene?
Cosi a prima vista per ogni ciclo il padre crea un figlio e il padre memorizza 1, poi qui si innescano due processi, entrambi richiamano una fork e i due padri ora hanno 12 e 13 entrambi poi si siddividono in altri due processi diventando quattro con risultato 124 135 o in formato diverso dipendente dal tempo di esecuzione.
Il problema è che la tua stringa arriva solo a 3.
Io proverei con :
char s[80]; //allocazione dinamica inutile in questo caso
// s[j++]=c[i];cambialo in
s[j++] = i + '0';