gpt4 book ai didi

c - 动态分配数组说明

转载 作者:太空狗 更新时间:2023-10-29 15:09:50 24 4
gpt4 key购买 nike

这是我的老师向我们展示的关于“如何在 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
}

我认为在 C 中,要定义一个数组,您必须将 [] 放在名称后面,那么 int** test 到底是什么?它不只是指向指针的指针吗? malloc() 行也让我很困惑......

最佳答案

根据声明 int** test;testpointer to pointer ,以及使用 malloc 函数为 int 值矩阵动态分配内存的代码 pice。

声明:

test = (int **)malloc(k * sizeof(int*));
// ^^------^^-------
// allocate for k int* values

为指向 int (int*) 的 k 指针分配连续内存。所以假设如果 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 中您应该避免它。阅读Do I cast the result of 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) 如果您想为所有数组分配完全连续的内存,这是为二维矩阵分配内存的一种方法,请查看此答案:Allocate memory 2d array in function C

4) 如果描述有帮助并且您想了解 3D 分配,请查看此答案:Matrix of String or/ 3D char array

关于c - 动态分配数组说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19240540/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com