请问,用一个函数来创建动态二维矩阵

请教,用一个函数来创建动态二维矩阵.
普通的数组,是可以的.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int *cretab(){
int *a;
int n;
printf("total? \n");
scanf("%d",&n);
a=calloc(n,sizeof(int));

int i;
for(i=0;i<n;i++){
printf("number:%d\n",i); scanf("%d",&a[i]);
}


return a;
}

void aff(int n,int *tab){
int i;
for(i=0;i<n;i++){
printf("%d",tab[i]);
}
printf("\n");
}

int main(void){
int *a;
a=cretab();
aff(3,a);
return 0;

}
二维的不行,我哪写错了呢?
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int **cretab(){
int **a;
int n,m;
printf("hang\n");
scanf("%d",&n);
printf("lie\n");
scanf("%d",&m);
a=calloc(n*m,sizeof(int));

int i,j;
for(i=0;i<n;i++){
for(j=0;j<m;j++)
{printf("hang:%d,lie:%d\n",i,j); scanf("%d",&a[i][j]);}
}


return a;
}

void aff(int n,int m,int **tab){
int i,j;
for(i=0;i<n;i++){
for(j=0;j<m;j++)
{printf("%d",tab[i][j]);}
printf("\n");
}
}

int main(void){
int **a;
a=cretab();
aff(3,3,a);
return 0;

}

最后就是为什么这行在GCC下可以编译通过,在VS下不行呢?谢谢各位!
a=calloc(n,sizeof(int));

------解决方案--------------------
{printf("%d",tab[i][j]);}