Non ne sono convinto!
parliamo dell'evidenza:

char *p[] = messaggi; Wrong!

passo "messaggi" a una funzione in cui dichiaro

char *p[] ed è esatto? E' questo il punto..