我无法使用两个变量创建一个二维数组(例如
在我的程序中,数组的尺寸只能在运行时确定。该数组用于表示一个网格。请问我应该如何在C语言中编写这个代码呢?
int arr[i][j]
不被允许),那么我该如何创建一个大小可动态调整的二维数组呢?在我的程序中,数组的尺寸只能在运行时确定。该数组用于表示一个网格。请问我应该如何在C语言中编写这个代码呢?
int arr[i][j]
不被允许),那么我该如何创建一个大小可动态调整的二维数组呢?首先分配一个指针数组。
/* 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**)
显式地进行强制类型转换为int **
。因此,第一行变成了int **array = (int**)calloc(size_x, sizeof(int*))
,第二行也需要使用(int*)
。 - JaBe您需要分配一个一维数组:
int* array = calloc(m*n, sizof(int));
并且这样访问它:
array[i*n + j]
n
可以在编译时推断出时,可能会输出相同的代码。一些示例展示了数组的多个(超过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);
在C语言中,多维数组只是每个元素都是另一个数组的数组。
因此,您需要首先为一个数组(行)分配内存。您可以使用malloc()
函数,它将返回指向数组的指针。
然后,您遍历数组,并为每个元素分配列数的内存。
注意:不要忘记使用free()
函数释放手动分配的内存,就像您使用malloc()
函数分配内存一样。
int arr[i][j];
。 (如果你没有C99编译器,现在是时候获取一个了。)话虽如此,你打算如何访问数组? 你可以希望使用arr[i][j]
来访问元素,或者你可以准备使用类似于arr[i*n+j]
的计算来访问它。对于这两种情况,所需的内存分配模式是完全不同的。 - Jonathan Leffler