La segunda forma que usastes es correcta
Código:
char (*miArray)[15];
miArray = malloc(n * sizeof *miArray);
Pero esto lo que hace es declarar un array de dos dimensiones, una de ellas con tamaño fijo de 15 caracteres. Es decir, en realidad, estás creando un array 1D de cadenas de texto que en sí son arrays.
Si lo que quieres es un array 2d de cadenas de texto, entonces buscas un array 3D, es decir