Ric*_*ard 4 c arrays pointers dynamic-arrays
这是我的老师向我们展示的示例代码"如何在C中动态分配数组?".但我不完全理解这一点.这是代码:
int k;
int** test;
printf("Enter a value for k: ");
scanf("%d", &k);
test = (int **)malloc(k * sizeof(int*));
for (i = 0; i < k; i++) {
test[i] = (int*)malloc(k * sizeof(int)); //Initialize all the values
}
Run Code Online (Sandbox Code Playgroud)
我想在C中,定义一个你必须把它放在[]
名字后面的数组,那究竟是什么int** test
; 它不仅仅是一个指针指针吗?这malloc()
条线也让我很困惑.....
Gri*_*han 15
根据声明int** test;
,test
是指针指针,代码pice使用malloc函数动态地为int值矩阵分配内存.
声明:
test = (int **)malloc(k * sizeof(int*));
// ^^------^^-------
// allocate for k int* values
Run Code Online (Sandbox Code Playgroud)
为k
指向int(int*
)的指针分配继续内存.所以假如k = 4
你那么得到类似的东西:
temp 343 347 351 355
+----+ +----+----+----+----+
|343 |---?| ? | ? | ? | ? |
+----+ +----+----+----+----+
Run Code Online (Sandbox Code Playgroud)
我假设地址是四个字节,?
意味着垃圾值.
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
Run Code Online (Sandbox Code Playgroud)
注意:表达式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
+--------+ | +-----+-----+-----+-----+
+-----------?
Run Code Online (Sandbox Code Playgroud)
再次?
意味着垃圾值.
附加要点:
1)您正在通过malloc转换返回的地址,但在C中您应该避免它.阅读我是否转换了malloc的结果?只需按以下步骤操作:
test = malloc(k* sizeof(int*));
for (i = 0; i < k; i++){
test[i] = malloc(k * sizeof(int));
}
Run Code Online (Sandbox Code Playgroud)
2)如果要动态分配内存,则需要在完成工作后明确释放内存(在释放动态分配的内存后,无法访问该内存).释放内存的步骤test
如下:
for (i = 0; i < k; i++){
free(test[i]);
}
free(test);
Run Code Online (Sandbox Code Playgroud)
3)如果你想为所有数组分配完全连续的内存,这是为2D矩阵分配内存作为数组的一种方法检查这个答案:在函数C中分配内存2d数组
4)如果描述有帮助,并且您想学习3D分配,请检查以下答案:字符串矩阵或/ 3D字符数组