@Vincenzo ... la malloc da correggere era la seconda, non la prima ...

@conqueror ... l'allocazione che hai scritto e' corretta ... l'assegnazione delle stringhe e' sbagliata ... devi scrivere

strcpy(temp[0], "casa");

e cosi' via ...

Per la free, va bene quello che ti e' stato suggerito ... prima la for con le free delle varie stringhe e poi la free per il doppio puntatore ...