Ma a dire il vero è strano che il compilatore non ti segnali alcun errore, al di là dell'esecuzione...
Tu hai definito questo tipo:
typedef char stringa[dmax];
e poi dichiari (in main()) queste variabili:
stringa nome[dmax],cognome[dmax],numero[dmax];
ma così facendo in sostanza stai dicendo che nome, cognome e numero sono "array" di stringhe, cioè in sostanza sono matrici di caratteri visto che già di per sé il tipo stringa è un array di caratteri...
direi che forse quello che volevi fare fosse questo
stringa nome,cognome,numero;
EDIT: oppure, se volevi dichiarare effettivamente delle matrici, devi fare attenzione agli argomenti che passi alle gets() nelle funzioni che richiami... scrivere
gets(nome)
non è corretto.