char *input_nombre()
{
char *nombre;
fgets(nombre
, 30, stdin
); return nombre;
}
Por pasar pasa lo siguiente:
char * nombre;
Declaras un puntero de tipo char... pero el puntero apunta a... ... exacto!!! a ninguna parte. Bueno, realmente sí apunta a algún sitio, por eso es puntero, lo que sucede es que apunta a una dirección de memoria que, en el mejor de los casos, no te pertenece. Y sí, esto implica que cualquier escritura sobre el puntero puede desembocar en violación de segmento o en otros problemas de graves consecuencias.
NUNCA se te ocurra utilizar un puntero sin inicializar... lo mejor que te puede pasar es que la aplicación finalice con error... lo peor es que corrompas datos de otra aplicación y pierdas datos importantes.