forse quello che ti disorienta è che la variabile viene dichiarata e assegnata allo stesso tempo.

La riga equivale a:

codice:
char *k ;
k= (char *)malloc(sizeof(char)*(n+1));
Per il resto il codice è decisamente standard.