用calloc函数分配的内存空间,怎样用二维数组的形式访问

用calloc函数分配的内存空间,怎样用二维数组的方式访问?
int m=10,n=20;
int** p;
p=(int**)calloc(m*n, sizeof(int));

本来想用p[i][j]的方式访问,但是debug时提示Program received signal SIGSEGV, Segmentation fault.

新手请教
------解决思路----------------------
int m=10,n=20,i;
int** p;
p=(int**)calloc(m, sizeof(int*));
for(i=0;i<m;++i)
    p[i]=(int*)calloc(n,sizeof(int));
或者
int m=10,n=20;
int *p=(int*)calloc(m*n,sizeof(int));
// 调用:p[i*n+j];0<=i<m,0<=j<n

------解决思路----------------------
这是很合理的想法,但你既然使用了**p,就应该为*p分配空间,即是设计旅馆,先分配楼,1-6楼,然后再为楼分配房间101-110,你只分配了房间,怎么分布呢?当然在具体存储时还是一维的,但你要用数组访问它,就需要这样:
参考代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
int m=10,n=20;
int i,j;
int **p = (int**)calloc(m, sizeof(int*));
for (i = 0; i < m; i++){
*(p + i) = (int*)calloc(n, sizeof(int));
}
for (i = 0; i < m; i++){
for (j = 0; j < n; j++){
p[i][j]=m*i+j;
printf("%d ", p[i][j]);
}
printf("\n");
}
getchar();
return 0;
}