Te recomienda que te leas esto, no es recomendable usar fflush(stdin) ni gets()
http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.htmlPor lo de tu programa, imagino que tu error está en usar ->, ya que esto se usa para asignar elementos de un puntero, lo usarias si tu iniciaras piloto2 como "piloto* piloto2[2]". Deberias usar "piloto2[ i ].nombre" y no te daria error.
Y el otro código no te da error creo que porque has tenido suerte, te explico:
Lo primero saber que un puntero y un array son equivalentes.
Con el operador "->", le dices al compilador que lo anterior era un puntero, si colocas "piloto2[ i ]->nombre" le dices al compilador que es un puntero cuando no lo es, sino que le asignas el array [ i ], en cambio cuando pones "piloto2->nombre" le dices que es un puntero y efectivamente "lo es", ya que no le asignas el array "[ i ]".
El algo dificil de explicar al menos para mi, espero que lo entendieras