如何在运行时创建C中的二维数组

我无法从2个变量创建2D数组(例如int arr[i][j]不允许),那么如何创建动态大小的2D数组呢?

数组的维度仅在我的程序中在运行时已知。 该数组用于表示网格。 我将如何在C中编码?

你必须分配一维数组:

 int* array = calloc(m*n, sizof(int)); 

并像这样访问它:

 array[i*n + j] 

编译器在访问二维数组时完成此操作,并且在编译时可以猜到n时,可能会输出相同的代码。

首先分配一个指针数组

 /* size_x is the width of the array */ int **array = (int**)calloc(size_x, sizeof(int*)); 

然后分配每列

 for(int i = 0; i < size_y; i++) { /* size_y is the height */ array[i] = (int*)calloc(size_y, sizeof(int)); } 

您可以使用array[i][j]访问元素。 释放内存的顺序相反:

 for(int i = 0; i < size_y; i++) { free(array[i]); } free(array); 

这是关于comp.lang.c的FAQ(我冒昧地添加了c-faq标签),它甚至有一个FGA(经常给出答案:-)请参阅http://c-faq.com/aryptr/index .html ,6.16 如何动态分配多维数组?

在C中,多维数组只是一个数组,每个元素都是另一个数组。

所以你需要先为一个数组(行)分配内存。 您可以使用malloc()函数,该函数将返回指向数组的指针。

然后迭代遍历数组,并为每个元素分配内存的列数。

注意:不要忘记使用free()函数free()手动分配的内存,就像使用malloc()分配它一样。

一些示例显示了数组的多个(超过2个)分配; 对于n×m数组,仅在两个分配(省略错误检查)中完成它是完全可行的:

 int **array = calloc(m, sizeof(*array)); int *data = calloc(m * n, sizof(*data)); for (int i = 0; i < m; i++) array[i] = &data[i * n]; ...use array[i][j]... free(array[0]); free(array);