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.