Voglio allocare dinamicamente una matrice di dimensione 3 passandola per indirizzo alla funzione.

Questo è il codice:
codice:
void alloca(unsigned char ****m,int r, int c, int p)
{ 
     int i,j;
     
     *m = malloc(r*sizeof(char*));
     
     for(i = 0; i < r; i++)
     {
           *m[i] = malloc(c*sizeof(char*));
           for(j = 0; j < c; j++)
                 *m[i][j] = malloc(p*sizeof(char));
     }
        
}
Al valore j = 1 da un errore di segmentazione che non riesco a capire come risolvere.
Posto il codice della funzione analoga (che non da alcun errore) dove la matrice non viene passata per indirizzo

codice:
unsigned char ***alloca(int r, int c,int p)
{ 
     int i,j;
     unsigned char ***m;
     
     m = malloc(r*sizeof(char*));
     
     for(i = 0; i < r; i++)
     {
        m[i] = malloc(c*sizeof(char*));
        for(j = 0; j < c; j++)
              m[i][j] = malloc(p*sizeof(char));
     }
        
     
        
     return m;
}