If you made each printf unique, say
printf ("1. I'm the child's child with PID %d and PPID %d.\n"
printf ("2. I'm the child's child with PID %d and PPID %d.\n"
printf ("3. I'm the child's child with PID %d and PPID %d.\n"
it might be easier to follow what's going on.

And a PPID of 1 means that the parent which created the child process has already died, and the (now orphaned) child has been adopted by the init process (pid=1)