Producto de matrices en C

//Librería que contiene las funciones scanf y printf
#include <stdio.h> 
//librería que contiene malloc
#include <stdlib.h>

//Declaración de prototipos
int *leematriz(int dim);
int *producto(int *a, int *b, int dim);
void imprimematriz(int *m, int dim);


//Función principal del programa
int main () 

{
 
 // Este programa calcula el producto de 2 matrices 3x3
 
 // Declaro las variables de mi función
 int *m1,*m2, *msol,dim;
 
 printf("Introduce la dimensión de las matrices:");
 scanf("%d", &dim);
 
 printf("Introduce los elementos de la primera matriz: \n");
 m1=leematriz(dim); 
 printf("Introduce los elementos de la segunda matriz: \n");
 m2=leematriz(dim); 
 
 msol=producto(m1,m2,dim);
 printf("La matriz resultado es: \n");
 imprimematriz(msol, dim);
 
 free(m1);
 free(m2);
 free(msol);
 //Fin del programa

 return 0;

}


//Función leematriz
//Dada una dimensión, lee los elementos de una matriz y la devuelve
int *leematriz(int dim)
{
 int i,j,*m;
 m=(int*)malloc(sizeof(int)*dim*dim);
 for (i=0;i<dim;i++)
 {
  for (j=0;j<dim;j++)
  {
   scanf("%d", (m+i*dim+j));
  }
 }
 return m;
}

//Función producto
//Imprime dos matrices y devuelve la matriz resultado
int *producto(int *a, int *b, int dim)
{
 int *res, i,j,t;
 
 //Reservo espacio para la matriz resultado
 res=(int*)malloc(sizeof(int)*dim*dim);
 
 //En C las matrices de n filas tienen filas de la 0 a la n-1
 for (i=0;i<dim;i++)
 {
  //En C las matrices de n columnas tienen cols. de la 0 a la n-1
  for (j=0;j<dim;j++)
  {
   //Inicializo el elemento de la matriz producto
   *(res+i*dim+j)=0;
   for (t=0;t<dim;t++)
   {
    *(res+i*dim+j)=*(res+i*dim+j)+*(a+i*dim+j)* *(b+i*dim+j);
   }
  }
 }
 return(res);
}

//Función imprimematriz
//Dada una matriz, la imprime por pantalla
void imprimematriz(int *m, int dim)
{
 int i,j;
 for (i=0;i<dim;i++)
 {
  //En C las matrices de n columnas tienen cols. de la 0 a la n-1
  for (j=0;j<dim;j++)
  {
   printf("%d\t", *(m+i*dim+j));
  }
  printf("\n");
 }
 return;

}