Si la quieres reservar en memoria dinamica prueba con esto:
#include <stdio.h>
#include <malloc.h>
typedef struct matrix {
int ** p;
}TMatrix;
int dim,i,j ;
TMatrix M;
int main() {
//pedimos la dimension de la matriz y comprobamos que sea mayor que cero
do {
puts("Introduce la dimension de la matriz: ");
scanf("%d", &dim);
}while (dim<1);
//reservamos la memoria y comprobamos que lo haga correctamente
M.p=(int**) malloc (dim*sizeof(int *));
if (M.p == NULL) {
puts("Error de memoria\n");
}
//vamos creando la matriz
for (i=0;i<dim;i++) {
M.p[i] = (int*) malloc (dim*sizeof(int));
for (j=0; j<dim;j++) {
printf("Introduce el elemento [%d,%d] : ", i+1, j+1 );
scanf("%d", &M.p [i][j]);
}
}
//Ahora devolvemos por pantalla la matriz ordenada
for (i=0; i<dim; i++) {
for (j=0; j<dim; j++) {
printf("%d ", M.p[i][j]);
}
puts("\n");
}
return 0;
}
Si luego no necesitaras la matriz no te olvides de liberar memoria. Yo esto lo hice pensando en meterlo a una funcion y no liberaba hasta el final del programa, pero no se lo que tu necesitas.