动态分配数组解释

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)

我假设地址是四个字节,?意味着垃圾值.

tempmalloc指定返回的变量地址,malloc分配大小=的继续内存块,k * sizeof(int**)在我的例子中= 16字节.

在for循环中,为kint 分配内存并将返回的地址分配给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字符数组