Lo que sucede es que cuando llamas a main() dentro de default, estas usando algo que de llama
recursion, o sea, que estas llamando una nueva version de main(), entonces cuando termina la ejecucion del main mas interno, regresa al main mas externo, y como dentro de cada main() tienes un getchar(), entonces llamaras a getchar() tantas veces como funciones main() hayas llamado.
Entonces ahi tambien esta la respuesta a tu segunda pregunta tambien, no, no es correcto llamar a main() en default, lo correcto seria que utilizaras un ciclo do..while para hacer la validacion de la opcion del menu y regresar al inicio.
Hay ocasiones en que la recursion si es util para ciertas aplicaciones, pero este no es el caso.
Por ejemplo, un ejemplo de una funcion en que pudiera ser util la recursion es para el calculo del factorial,, es mas, te aconsejo que busques informacion de como se calcula el factorial de manera recursiva, para que te des mejor cuenta del uso de la recursion.
Saludos