我无法从2个变量创建2D数组(例如int arr[i][j]
不允许),那么如何创建动态大小的2D数组呢?
数组的维度仅在我的程序中在运行时才知道。该数组用于表示网格。我将如何在C中编码?
答案 0 :(得分:10)
首先分配一个指针数组
/* 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);
答案 1 :(得分:7)
你必须分配一维数组:
int* array = calloc(m*n, sizof(int));
然后像这样访问:
array[i*n + j]
编译器在访问二维数组时完成此操作,并且在编译时可以猜到n
时可能会输出相同的代码。
答案 2 :(得分:1)
这是关于comp.lang.c的常见问题解答(我冒昧地添加了c-faq标签),它甚至还有一个FGA(经常给出答案:-) 请参阅http://c-faq.com/aryptr/index.html,6.16 如何动态分配多维数组?
答案 3 :(得分:0)
在C中,多维数组只是一个数组,每个元素都是另一个数组。
所以你需要先为一个数组(行)分配内存。您可以使用malloc()
函数返回指向数组的指针。
然后迭代遍历数组,并为每个元素分配内存的列数。
注意:不要忘记使用free()
函数释放您手动分配的内存,方法与使用malloc()
分配它的方式相同。
答案 4 :(得分:0)
一些示例显示了数组的多个(超过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);