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

你能帮我弄清楚如何在一次分配呼叫中分配2Darrays吗?

我试着做:

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

但它不起作用。

num是行和列。

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

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

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

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

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

代码可以为2D数组分配内存并返回指向该内存的指针。 指向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; 

或者,代码可以为1D数组分配内存并返回指向该内存的指针。 指向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; 

虽然我认为“二维整数数组”的含义明确地类似于int arr[10][10] ,但在网上搜索却提出了“使用指针数组”或“使用指针指针”这样的解释。 (参见,例如, 这篇文章 )。 本答案的其余部分基于int arr[r][c]forms的二维数组,其中r表示行数, c表示每行的列数。

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

 #define COLS 3 void printArray(int array[][COLS], int rows) { for(int row=0; row 

您可以使用以下两种方式之一分配2Darrays。

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:单连续块

这可能是您想要的方法,您可以在一次分配中完成所有操作。 这将要求您以二维表示forms存储二维数组。

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

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