如何在一个分配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]