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

时间:2011-09-17 17:39:55

标签: c multidimensional-array

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

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

5 个答案:

答案 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);