我不能创建一个2D数组从2个变量(如int arr[i][j]
不允许),所以我将如何创建一个动态大小的2D数组?
数组的维数只有在我的程序运行时才知道。该数组表示一个网格。我怎么用C写这个呢?
首先分配一个指针数组。
/* size_x is the width of the array */
int **array = (int**)calloc(size_x, sizeof(int*));
然后分配每个列。
for(int i = 0; i < size_x; i++)
{
/* size_y is the height */
array[i] = (int*)calloc(size_y, sizeof(int));
}
您可以使用array[i][j]
访问元素。释放内存的顺序正好相反:
for(int i = 0; i < size_x; i++)
{
free(array[i]);
}
free(array);
你必须分配一个一维数组:
int* array = calloc(m*n, sizof(int));
然后像这样访问它:
array[i*n + j]
当访问二维数组时,编译器正是这样做的,并且当n
可以在编译时猜出时,可能会输出相同的代码。
这是一个关于comp.lang.c的FAQ(我冒昧地添加了c-faq标签),它甚至有一个FGA(经常给出的答案:-)参见http://c-faq.com/aryptr/index.html, 6.16 如何动态分配多维数组?
在C语言中,多维数组就是每个元素都是另一个数组的数组。
因此,您需要首先为一个数组(行)分配内存。您可以使用malloc()
函数,它将返回指向数组的指针。
然后遍历数组,为每个元素分配列数的内存。
注意:不要忘记释放你用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);