根据声明int** test;
,test
是指向指针的指针,并且代码 pice 使用 malloc 函数为 int 值矩阵动态分配内存。
陈述:
test = (int **)malloc(k * sizeof(int*));
// ^^------^^-------
// allocate for k int* values
k
为指向 int ( int*
)的指针分配 continue 内存。所以假设如果k = 4
你得到类似的东西:
temp 343 347 351 355
+----+ +----+----+----+----+
|343 |---►| ? | ? | ? | ? |
+----+ +----+----+----+----+
我假设地址是四个字节,?
意味着垃圾值。
temp
由 malloc 分配返回地址的变量,malloc 分配大小为 = 的连续内存块 =k * sizeof(int**)
在我的示例中 = 16 字节。
在 for 循环中,您为k
int 分配内存并将返回的地址分配给temp[i]
(先前分配的数组的位置)。
test[i] = (int*)malloc(k * sizeof(int)); //Initialize all the values
// ^^-----^^----------
// allocate for k int values
注意:表达式temp[i]
== *(temp + i)
。因此,在每次迭代的 for 循环中,您为 k int 值的数组分配内存,如下所示:
First malloc For loop
--------------- ------------------
temp
+-----+
| 343 |--+
+-----+ |
▼ 201 205 209 213
+--------+ +-----+-----+-----+-----+
343 | |= *(temp + 0) | ? | ? | ? | ? | //for i = 0
|temp[0] |-------| +-----+-----+-----+-----+
| 201 | +-----------▲
+--------+ 502 506 510 514
| | +-----+-----+-----+-----+
347 |temp[1] |= *(temp + 1) | ? | ? | ? | ? | //for i = 1
| 502 |-------| +-----+-----+-----+-----+
+--------+ +-----------▲
| | 43 48 52 56
351 | 43 | +-----+-----+-----+-----+
|temp[2] |= *(temp + 2) | ? | ? | ? | ? | //for i = 2
| |-------| +-----+-----+-----+-----+
+--------+ +-----------▲
355 | |
| 9002 | 9002 9006 9010 9014
|temp[3] | +-----+-----+-----+-----+
| |= *(temp + 3) | ? | ? | ? | ? | //for i = 3
+--------+ | +-----+-----+-----+-----+
+-----------▲
再次?
意味着垃圾值。
附加点:
1)您正在通过 malloc 转换返回的地址,但在 C 中您应该避免它。阅读我是否会转换 malloc 的结果?只需执行以下操作:
test = malloc(k* sizeof(int*));
for (i = 0; i < k; i++){
test[i] = malloc(k * sizeof(int));
}
2)如果您要动态分配内存,则需要在完成工作后显式释放内存(释放动态分配的内存后,您将无法访问该内存)。释放内存的步骤test
如下:
for (i = 0; i < k; i++){
free(test[i]);
}
free(test);
3)如果您想为所有数组分配完全连续的内存,这是为 2D 矩阵分配内存作为数组数组的一种方法,请检查此答案:Allocate memory 2d array in function C
4)如果描述有帮助并且您想学习 3D 分配检查这个答案:字符串矩阵或/ 3D char 数组