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*