/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
int** generateMatrix(int n, int* returnSize, int** returnColumnSizes){
int startx = 0, starty = 0;
int loop = n/2;
int offset = 1;
int i, j;
int** ret = malloc(sizeof(int*)*n);
*returnSize = n;
*returnColumnSizes = malloc(sizeof(int)*n);
for (int i = 0; i < n; i++){
ret[i] = malloc(sizeof(int)*n);
memset(ret[i], 0, sizeof(int)*n);
(*returnColumnSizes)[i] = n;
}
int num = 1;
while (loop--){
i = startx;
j = starty;
for (j = starty; j < starty + n - offset; j++){
ret[startx][j] = num++;
}
for (i = startx; i < startx + n - offset; i++){
ret[i][j] = num++;
}
for (; j > starty; j--){
ret[i][j] = num++;
}
for (; i > startx; i--){
ret[i][j] = num++;
}
startx++;
starty++;
offset += 2;
}
if (n % 2) ret[n/2][n/2] = num;
return ret;
}
注意:j < starty + n - offset 而不是j < n - offset
ret[n/2][n/2] = num; 而不是ret[n/2][n/2] = num++;
基础知识
如何正确使用malloc函数进行动态分配
1.申请一维数组
一维数组的数组名可以看成数组起始元素的首地址,因此我定义一个int *t_array的指针,分配n个大小的int型空间,写法如下:
int * t_array; //定义一维整型指针数组
t_array= (int *)malloc( sizeof(int) * n ); //分配4*n个字节的内存空间
free(t_array); //内存空间不再用时,释放内存空间
2.申请二维空间
二维数组的数组名是其所有一维数组的首地址,因为二维数组的数组名是指针的指针,因为我定义一个row行column列的二维数组,写法如下:
int ** t_array; //定义二维整型指针数组
int row; //行序号
int column; //列序号
int i;
scanf("%d %d", row,column); //输入行数,列数
t_array= (int **)malloc( sizeof(int *) * row); //分配所有行的首地址 (分配的是行指针单元,每个单元的大小为 sizeof(int *) )
for(i=0;i
t_array[i]= (int *)malloc(sizeof(int) * column ); //再分配column个整数单元,上面的row个行指针指向这column个整数单元首地址
for(i=0;i
free(t_array[i]);
free(t_array)
这里摘出部分代码理解一下 int* returnSize 和 int** returnColumnSizes:
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
int** generateMatrix(int n, int* returnSize, int** returnColumnSizes){
int** ret = (int **)malloc(sizeof(int*)*n); //准备n个一阶指针的空间,每个一阶指针可以指向一个数组
*returnSize = n; //行数为n
*returnColumnSizes = (int *)malloc(sizeof(int)*n);
for (int i = 0; i < n; i++){
ret[i] = (int *)malloc(sizeof(int)*n);
memset(ret[i], 0, sizeof(int)*n); //数组初始化,相当于ret[]={0};
//memset(首地址,值,sizeof(地址总大小));
//memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。
(*returnColumnSizes)[i] = n; //第i行的列数为n
}
return ret; //最后返回二维数组首地址
}
总结:malloc 一个数组,得到一个指向数组的一阶指针,main 函数传进来一个二阶指针指向你这个一阶指针,这样它就能找到你返回的列数组了。
Return an array of arrays of size *returnSize.
The sizes of the arrays are returned as *returnColumnSizes array.
Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
详解:
returnSize
是一个指针, *returnSize
表示要返回的二维数组的行数。
returnColumnSizes
是二阶指针, *returnColumnSizes
是一阶指针。returnColumnSizes
是一个数组,指针数组,用来装我们返回的二维数组每一行有多少个元素的(即列数)。
举个例子,利用malloc函数申请一个二维数组ret [[1,2,3,4],[5,6,7,8],[9,10,11,12]],array 表示最外侧括号的矩阵,arrays表示里面的几个小矩阵。
第一维的长度为 3,因此这里
int** ret = (int **)malloc(sizeof(int*)*3); //申请3个 int* 单元
*returnSize = 3;
第二维的长度是一个一维数组[4,4,4],所以类型为 int *,因此这里 *returnColumnSizes = [4,4,4]
,也就是代码里的 for (i = 0; i < 3; i++) (*returnColumnSizes)[i] = 4;
。
*returnColumnSizes = (int *)malloc(sizeof(int)*3); //申请3个int单元
for (i = 0; i < 3; i++){
ret[i] = (int *)malloc(sizeof(int)*4); //每个int单元里再申请4个int单元
//memset(ret[i], 0, sizeof(int)*4);
(*returnColumnSizes)[i] = 4;
}
C语言的二维数组申请
详解力扣中 int *return Size和 int **returnColumnSizes
心得
好像这下才真正理解malloc了