L'unico puntatore su cui puoi fare il free è quello della malloc (ovvero quello che hai memorizzato in b).

Quando scrivi

b=a;

il valore del puntatore b diventa un altro, ovvero diventa il puntatore a "ciao" (fra l'altro un puntatore ad una stringa costante) e quindi non puoi usare la free.

Quello che forse non ti è chiaro è che la cosa importante non è il nome del puntatore (a b o c) ma il suo valore.