Premesso che il programma funziona correttamente fino alla free:

codice:
//prototipo
char **MallocChar(int nr, int nc);

main()
{
   char **m; //dichiara m
   ...
   m=MallocChar(nr, nc); //chiamata alla funzione
   ...
   
   for (i=0; i< nr;i++) 
      free(m[i]); //qua si pianta!!!!!!!
   free(m);
   
   return 0;
}

//funzione per allocare la memoria
char **MallocChar(int nr, int nc)
{
   int i;
   char **m;
   m = (char **)malloc(nr * sizeof(char *));
   for (i=0; i< nr;i++)
      m[i] = (char *)malloc(nc * sizeof(char));
   return m;
}
Mi sembra ok...