Asignar matriz 2d de memoria en la función C

¿Cómo asignar memoria dinámica para 2d array en función? Lo intenté de esta manera:

int main()
{
  int m=4,n=3;
  int** arr;
  allocate_mem(&arr,n,m);
}


void allocate_mem(int*** arr,int n, int m)
{
  *arr=(int**)malloc(n*sizeof(int*));
  for(int i=0;i<n;i++)
    *arr[i]=(int*)malloc(m*sizeof(int));
} 

Pero no funciona.

Respuestas a la pregunta(8)

Su respuesta a la pregunta