Ciao a tutti!!!

Stavo provando a allocare dinamicamente le matrici.
A dire il vero il programma che ho scritto funziona però vorrei conferma da qualcuno più esperto di me per vedere se salto qualcosa.
Vi ringrazio anticipatamente
codice:
#include <stdio.h>
#include <stdlib.h>

void allocaMat(int ***, int *, int *);
void insMat(int **, int, int);
void stampa(int **, int, int);
void liberaMat(int ***, int);

int main()
{
    int **mat=NULL;
    int r, c;

    allocaMat(&mat, &r, &c);
    insMat(mat, r, c);
    stampa(mat, r, c);
    liberaMat(&mat, r);

    return 0;
}

void liberaMat(int ***m, int r)
{
    int i;

    for(i=0; i<r; i++){
        free((*m)[i]);
    }

    free(*m);
}

void stampa(int **m, int r, int c)
{
    int i, j;

    printf("\n\n");

    for(i=0; i<r; i++){
        for(j=0; j<c; j++){
            printf("%d ", m[i][j]);
        }
        printf("\n");
    }
}

void insMat(int **m, int r, int c)
{
    int i, j;

    for(i=0; i<r; i++){
        for(j=0; j<c; j++){
            printf("\nmatrice[%d][%d] = ", i+1, j+1);
            scanf("%d", &m[i][j]);
        }
    }
}

void allocaMat(int ***m, int *r, int *c)
{
    int i;

    printf("\nInserire il numero di righe: ");
    scanf("%d", r);
    printf("\nInserire il numero di colonne: ");
    scanf("%d", c);

    *m=(int **)malloc((*r)*(sizeof(int *)));

    if(*m==NULL){
        printf("\n\nAllocazione impossibile...");
        exit(1);
    }

    for(i=0; i<*c; i++){
        (*m)[i]=(int *)malloc((*c)*sizeof(int));
        if(((*m)[i])==NULL){
            printf("\n\nAllocazione impossibile...");
        }
    }
}