Ufff.... este programa está un poco bastante mal echo jeje
A ver, para almacenar un string, primero debes reservar memoria para ello, hacer esto es tener una violación de segmento asegurada:
Tienes que reservar memoria, por ejemplo: 'char otra[ 40 ];' ahora si puedes empezar a llenar el array 'otra' con caracteres (el 40 lo he puesto por poner. Reserva tanta memoria como creas).
Más cosas, en la linea 'frase=(char*) calloc(tam,sizeof(char))' le falta un punto y coma (;) final.
Si haces las cosas como te acabo de indicar, el programa funciona perfectamente.
Respondiendo a tu pregunta: Lo que te estaría sucediendo, seguramente, es que al añadir la variable 'nose', tendrías unos bytes extra para poner el texo y, por tanto, eso haría que no se produjese una violación de segmento. Sin esta variable, al escribir, estarías machacando instrucciones del programa y por eso no funcionaría. Si te interesa el tema y como solucionarlo, doy una explicación más detallada en este
post.
P.D.: Para el siguiente post, por favor, usa el coloreado de sintaxis ya que así cuesta de entender el código
Saludos