如何在运行时用C语言创建一个二维数组



我不能创建一个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);

相关内容

  • 没有找到相关文章

最新更新