Ci sono un paio di errori.

1) Deallochi due volte la stessa zona di memoria:

codice:
p=malloc((n+1)*sizeof(char));
q=p;
...
free(q);
free(p);
2) Copi una stringa su un puntatore per il quale non hai allocato memoria:

codice:
strcpy(vett[cont], p);
'vett' e` un array di puntatori, e se scrivi all`indirizzo di tali puntatori, che in questo caso non sono ne` allocati ne` inizializzati .. beh, dovresti sapere cosa succede, anzi, l`hai visto con i tuoi occhi.

Soluzioni:

1) Naturalmente o deallochi 'p' o 'q', ma non entrambi perche` puntano alla stessa zona di memoria.

2) Se vuoi solo stampare la stringa, allora l`array di puntatori e` superfluo, basta che stampi 'p' invece di 'vett[ cont ]' che non si sa cosa contenga; se invece vuoi mantenere le stringhe nell`array di puntatori, invece di strcpy() devi fare cosi`:

codice:
vett[ cont ] = p; /* o q, e` uguale */
In modo che vett[ cont ] punti alla memoria allocata. In questo caso pero` free() devi chiamarlo alla fine del programma, altrimenti l`uso dell`array e` completamente superfluo (come sopra).

Per chiarimenti sono qui.

Ciao.