最近在用C解leetcode题目时,碰到一题需要返回一个动态二维数组的头指针,搞了半天才弄好。
用c语言创建二维动态数组有两种方式。
1. 转化为指针数组申请,代码如下。
const int cols = 10;
int rows = 10;
int(*p)[cols];
p = (int(*)[cols])malloc(rows*cols *sizeof(int));
free(p);
p = NULL;
注意:
int(*p)[cols]与int* p[cols]不同。前者申请了一个指向数组的指针,即数组指针,等同于int a[cols], int*p =a,后者申请了一个元素为指针的数组,即指针数组,等同于typedef int* pINT; pINT p[cols]
此法中如要返回二级指针,这应该使用(int**)进行强制转换,并且在读取值时不能使用int t =p[i][j],而应当使用int t =*(p+i*cols+j)=p[i*cols +j]; 因为对于二维数组,a[10][10],a只是一个一级指针而已。
2. 直接申请一个二级指针,先为每行的头地址申请空间,再依据每行头地址逐行申请空间。
const int cols = 10;
int rows = 10;
int **p =NULL;
int i = 0;
p = (int**)malloc(rows *sizeof(int*));
for (i = 0; i < rows; i++)
{
*(p + i) = (int*)malloc(cols*sizeof(int));
}
for(i = 0; i < rows; i++)
{
free(*(p + i));
*(p + i) = NULL;
}
free(p);
p = NULL;
此方法申请和释放内存都比较麻烦,但是只需要返回一个二维数组的头指针便可,并且获取值时可直接使用int t =p[i][j] =*(*(p+i)+j).