Corretto. Tieni presente che alla void function liberaMat() non hai bisogno di passare il puntatore per "riferimento": la free() non ne modifica il valore, si limita a deallocare l'area di memoria da esso puntata. Avrebbe senso passarlo per "riferimento" se facessi una cosa del genere:

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

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

    free(*m);
    
    *m = NULL;
}
cioè appunto se andassi a modificare il valore del puntatore (in realtà diventa necessario solo per l'ultima istruzione, per l'altra andrebbe bene anche il passaggio per copia). Peraltro l'annullamento di un puntatore dopo la free() è operazione consigliata per evitare che eventuali altre free() accidentali sullo stesso puntatore possano causare problemi, infatti lo standard prevede che la chiamata free(NULL) non abbia effetti:

codice:
The free function causes the space pointed to by ptr to be deallocated, that is, made
available for further allocation. If ptr is a null pointer, no action occurs.