【问题标题】:How can I dynamically allocate 2D-array in one allocate C如何在一个分配 C 中动态分配二维数组
【发布时间】:2017-09-28 08:22:08
【问题描述】:

你能帮我弄清楚如何在一次分配调用中分配一个二维数组吗?

我尝试过:

int** arr = (int**)malloc(num * num * sizeof(int*));

但它不起作用。

num 是行和列。

【问题讨论】:

  • int (*arr)[num] = malloc(sizeof(int[num][num]));
  • 那不是二维数组,不能指向一个!
  • @WeatherVane:当然可以。它只是一种不同的类型。
  • @Olaf 是的,我刚刚尝试了 BLUEPIXY 代码,非常好。

标签: c malloc allocation


【解决方案1】:

如何在 1 分配 C 中动态分配 array2D

让我们从什么是二维数组开始:
2D array or "array 3 of array 4 of int" 示例

int arr1[3][4];
arr1[0][0] = this;

OP 的代码声明了一个pointer to pointer to int,而不是二维数组,也不是指向二维数组的指针。
顺便说一句,不需要演员表。

int** arr = (int**)malloc(num * num * sizeof(int*));

代码可以为二维数组分配内存并返回指向该内存的指针。 pointer to array 5 of array 6 of int

 int (*arr2)[5][6] = malloc(sizeof *arr2);
 if (arr2 == NULL) return EXIT_FAILURE;
 (*arr2)[0][0] = this;
 return EXIT_SUCCESS;

 // or with Variable Length Arrays in C99 and optionally in C11
 int (*arr3)[num][num] = malloc(sizeof *arr3);
 (*arr3)[0][0] = that;

另外,代码可以为一维数组分配内存并返回指向该内存的指针。 pointer to array 8 of int。有时这通常是“分配 2D”数组想要的,实际上是指向 1D 数组的指针

 int (*arr4)[8] = malloc(sizeof *arr4 * 7);
 arr4[0][0] = this;

 // or
 int (*arr5)[num] = malloc(sizeof *arr5 * num);
 arr5[0][0] = that;

【讨论】:

    【解决方案2】:

    您可以通过以下两种方式之一分配二维数组。

    1:指向数组的指针数组

    这将是:

    int rows = 10; 
    int cols = 10;
    int **array = malloc(rows * sizeof(int*));
    for (int i = 0; i < rows; i++) {
        array[i] = malloc(cols * sizeof(int));
    }
    

    array 现在将指向一个指针列表,每个指针代表一行,这些指针将指向行中的元素。在这种情况下,您可以使用array[n][m] 访问第 n 行和第 m 列

    2:单个连续块

    这可能是您想要的方法,您可以在一次分配中完成所有操作。这需要您将 2D 数组存储为 1D 表示形式。

    int rows = 10; 
    int cols = 10;
    int *array = malloc(rows * cols * sizeof(int));
    

    然后您可以使用偏移量存储和检索第 n 行和第 m 列:array[(n * cols) + m]

    【讨论】:

    • 它们都不是二维数组。第一个不会一次性分配。
    【解决方案3】:

    虽然我认为“2D 整数数组”的含义明确类似于 int arr[10][10],但在网上搜索会出现“使用指针数组”或“使用指向指针的指针”之类的解释(参见,例如this post)。该答案的其余部分基于int arr[r][c] 形式的二维数组,其中r 表示行数,c 表示每行的列数。

    如果不支持可变长度数组,则至少 c 必须是 const 表达式(即在编译时已知)。相比之下,r 也可以在运行时定义,这样至少行数是“动态的”。然后可以将二维数组表示为一维数组的(可能不完整的)数组:

    #define COLS 3
    
    void printArray(int array[][COLS], int rows) {
        for(int row=0; row<rows; row++) {
            for (int col=0; col<COLS; col++) {
                printf("%d ", array[row][col]);
            }
            printf("\n");
        }
    }
    
    int main() {
    
        typedef int oneD[COLS];
    
        int rows = 5;
        size_t myArray5RowsSize = rows*sizeof(oneD);
        oneD *myArray5Rows = malloc(myArray5RowsSize);
        memset(myArray5Rows,0,myArray5RowsSize);
        myArray5Rows[0][0] = 0;
        myArray5Rows[1][1] = 1;
        myArray5Rows[2][2] = 2;
    
        printArray(myArray5Rows, 5);
    
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-02-03
      • 1970-01-01
      • 2013-11-14
      • 2015-02-10
      • 2015-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多