Gracias por contestar pink efectivamente no estaba...
Bueno para el código final para liberar correctamente esta así:
/* Dinamicamente */
char **p;
int i;
p= (char **)malloc(5 * sizeof(char *));
for(i=0;i<5;i++)
p[i]= (char*)malloc(TAM_BLOQUE_ARRAY*sizeof(char *));
// Resto de código
...
// Una vez terminado para liberar memoria correctamente
// primero hacemos:
for(i=0;i<5;i++)
free(p[i]);
// Y finalmente el tamaño del array
free(p)
Como ves esto lo que hara sera reservar memoria para su uso, una vez terminado el programa
liberar "celda por celda"(en este caso un total de 5) y luego el array completo que era de 5
indices.
PD: si en vez de declarar
char **p; lo hubieramos hecho
char *p[5]; no era necesario el último free(p), ya que el tamaño es estatico solo liberaremos la memoria usada...
EDITO: también me olvidaba de decir que TAM_BLOQUE_ARRAY como su nombre lo indica es el tamaño que tendra ese indice de array es decir si hicieramos esto:
p[3]= (char*)malloc( 15*sizeof(char *));
Estariamos diciendolo a la 3º posicion del array p que tendra un tamaño de 15 y ese sera el tamaño maximo que podra "guardar" esa celda.