Matriz traspuesta 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 tam);
int *traspuesta(int *a, int fil, int col);
void imprimematriz(int *m, int fil, int col);


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

{
 
 
 // Declaro las variables de mi función
 int *m1, *msol,nf,nc;
 
 printf("Introduce el número de filas de la matriz:");
 scanf("%d", &nf);

    printf("Introduce el número de columnas de la matriz:");
 scanf("%d", &nc);
    
 printf("Introduce los elementos de la matriz: \n");
 m1=leematriz(nf*nc);
 
 msol=traspuesta(m1,nf,nc);
 printf("La matriz resultado es: \n");
 imprimematriz(msol, nc,nf);
 
 free(m1);
 free(msol);
 //Fin del programa

 return 0;

}


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

//Función traspuesta
//Calcula la traspuesta de una matriz
int *traspuesta(int *a, int fil, int col)
{
 int *res, i,j;
 
 //Reservo espacio para la matriz resultado
 res=(int*)malloc(sizeof(int)*fil*col);
 
 //En C las matrices de n filas tienen filas de la 0 a la n-1
 for (i=0;i<col;i++)
 {
  //En C las matrices de n columnas tienen cols. de la 0 a la n-1
  for (j=0;j<fil;j++)
  {
   *(res+i*fil+j)=*(a+j*col+i);
   
  }
 }
 return(res);
}

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

}