【问题标题】:how to dynamically declare a 2-d array in c using type: int(*)[ ]?如何在 c 中使用类型动态声明二维数组:int(*)[]?
【发布时间】:2021-01-17 14:24:58
【问题描述】:

我尝试过使用 int**(pointer to a pointer) 和 int*[](array of pointers) 但我无法使用 指向数组的指针。我们如何使用指向数组的指针ma​​lloc函数在c中创建二维数组。

请提供示例代码:)

【问题讨论】:

  • 具体遇到了什么困难?数组类型在动态分配方面与其他类型没有区别。您声明一个适当类型的指针,并将适当的malloc() 调用的结果分配给它。 提供一些代码来说明你的问题怎么样。

标签: c multidimensional-array


【解决方案1】:
void *allocateMemory2DArray(size_t x, size_t y)
{
    int (*array)[x][y];

    array = malloc(sizeof(*array));
    return array;
}

5d 数组

void *allocateMemory5DArray(size_t x, size_t y, size_t v, size_t q, size_t r)
{
    int (*array)[x][y][z][q][r];

    array = malloc(sizeof(*array));
    return array;
}

【讨论】:

    【解决方案2】:

    让我们从头开始。

    动态分配T 的 N 元素数组(对于一些任意的T)的典型方法是

    T *p = malloc( sizeof *p * N ); // sizeof *p == sizeof (T)
    

    这为T类型的N个对象分配了足够的空间,p指向第一个元素

       T *        T
       +–––+      +–––+
    p: |   |–––––>|   | p[0]
       +–––+      +–––+
                  |   | p[1]
                  +–––+
                   ...
                  +–––+
                  |   | p[N-1]
                  +–––+
    

    现在,将 T 替换为数组类型 - R [M]

    R (*p)[M] = malloc( sizeof *p * N );
    

    这为 R [M] 类型的 N 个对象分配了足够的空间 - IOW 你已经分配了一个 R 的 NxM 数组。 p 仍然指向第一个元素,只是在这种情况下,第一个元素本身就是一个数组。

       R (*)[M]    R [M]    
       +–––+       +–––+
    p: |   |––––––>|   | p[0][0]
       +–––+       + - +
                   |   | p[0][1]
                   + - +
                    ...
                   + – + 
                   |   | p[0][M-1]
                   +––—+
                   |   | p[1][0]
                   + – +
                   |   | p[1][1]
                   + - +
                    ...
                   + – +
                   |   | p[1][M-1]
                   +–––+
                    ...
                   + – +
                   |   | p[N-1][M-1]
                   +–––+
    

    您可以像任何常规二维数组一样索引到 p

    您可以将其扩展到更高维度的数组 - 将 R 替换为另一种数组类型,例如 Q [L]

    Q (*p)[M][L] = malloc( sizeof *p * N );
    

    这会为 NxMxL 数组分配空间,并且您可以再次像任何 3d 数组 p[i][j][k] 一样对其进行索引。

    语义在每种情况下都完全相同 - 您为 N 个对象分配空间,只是对象的类型不同。

    【讨论】:

      猜你喜欢
      • 2020-08-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-09
      • 1970-01-01
      • 2021-04-07
      相关资源
      最近更新 更多