Non confondere le due cose:

**ptr è un puntatore ad un puntatore, o, in modo equivalente, un array di array.

Perciò, devi prima allocare la memoria per il vettore di vettori, e poi la memoria per ogni vettore dell'array:

codice:
ptr = malloc( sizeof(char* ) * n_stringhe );   //ptr è di tipo char**

ptr[0] = malloc (sizeof(char ) * n_caratteri );   //ptr[0] è di tipo char*