Originariamente inviato da Celebron
a=malloc(n*n*sizeof(char)); <--- WRONG

prima allochi le righe
poi con un for allochi le colonne

con la tua soluzione hai semplicemente creato un array A di n*n "caselle"
quindi se ho capito bene dovrei scrivere
codice:
a=malloc(n*sizeof(char));
for (i=0,i<=n,i++)
     *(a+i)=malloc(n*sizeof(char))
edit: in più non capisco la parte iniziale dove hai un
char M[n][n] senza avere n inizializzata a nessun valore

ma scusa il compilatore non ti restituisce nessun warning? Se no, per favore, cambialo

e non capisco nemmeno il fatto che poi a M assegni "a"
facendo un M[n][n] già allochi (allocazione automatica), non ha senso fare ciò che tu hai fatto.

Dovresti prima creare un char** M;
quindi fare l'allocazione dinamica come ti ho spiegato sopra

a quel punto puoi accedere alle posizione di M come se fosse una matrice normale.
per quanto riguarda il compilatore, uso devc++. Lo so che fa schifo ma sul computer che sto usando ora ho windows e non sono riuscito a trovare di meglio. E comunque (e la cosa mi preoccupa!) non mi da nessun warning.
Il fatto è che questo è uno degli esercizi che ha assegnato il professore. Già non sono sicuro di poter usare l'allocazione dinamica e inoltre la funzione che devo fare deve avere come parametro M[n][n] non un puntatore.