@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 ...