Salve a tutti...

Sto cercando di scrivere un programma in C che mi crei una matrice con allocazione dinamica, assegnando poi a ciascun elemento un valore casuale minore di 20...
Ho definito il tipo matrice come una struttura contenente un doppio puntatore a interi, e poi due interi, corrispondenti rispettivamente al numero di righe e colonne della matrice...
Ovviamente, se posto qui, è perchè c'è qualcosa che non torna.

A livello di compilazione, non mi da problemi...Però quando lo mando in esecuzione si blocca..

Ho controllato dove potesse essere l'errore, e credo che il problema riguardi proprio l'allocazione della memoria...Non riesco però a individuare l'errore...

Vi allego il codice:

codice:
#include <stdio.h>
#include <time.h>
#include <math.h>

typedef struct {
        int **m;
        int r;
        int c;
        } mat;
        
        
void Alloca(mat);


main () {
     int i,j;
     mat M;
     M.r=5;
     M.c=6;
     Alloca(M);
     srand(time(NULL));
     for (i=0,j=0;i<M.r;j++) {
         if (j==M.c) {
                       j=0;
                       i++;
                       }
         M.m[i][j]= rand()%20;
         
         
                       }
                       
     for (i=0,j=0;i<M.r;j++) {
         if (j==M.c) {
                       j=0;
                       i++;
                       printf("\n");
                       }
         
         printf("%d\t", M.m[i][j]);
         
                       
                       }
     
     
     
     }
     
     
     
void Alloca (mat M) {
     int i;
     M.m=(int**)calloc(M.r,sizeof(int*));
     
     for (i=0;i<M.r;i++) 
         M.m[i]=(int*)calloc(M.c,sizeof(int));
         
         return;
         }

Grazie per l'aiuto.