如何在一个分配C中动态分配2D数组

问题描述 投票:0回答:3

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

我尝试这样做:

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

但是它不起作用。

num
是行和列。

c multidimensional-array malloc allocation
3个回答
6
投票

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

让我们从什么是二维数组开始:
2D 数组或“int 数组 4 的数组 3”的示例

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

OP 的代码声明了一个指向 int 的指针,而不是 2D 数组,也不是指向 2D 数组的指针。
顺便说一句,不需要演员阵容。

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

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

 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;

代码也可以为一维数组分配内存并返回指向该内存的指针。 指向 int 数组 8 的指针。有时,这通常是人们想要的“分配 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]


1
投票

虽然我认为“整数的二维数组”的含义毫无疑问类似于

int arr[10][10]
,但在网络上搜索时出现了诸如“使用指针数组”或“使用指向指针的指针”之类的解释(参见,例如,这篇文章)。该答案的其余部分基于
int arr[r][c]
形式的 2D 数组,其中
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;
}
© www.soinside.com 2019 - 2024. All rights reserved.