【发布时间】:2022-01-12 01:08:32
【问题描述】:
我正在编写一个 C 程序,该程序需要我访问和存储不同大小的矩阵(二维数组)以供将来操作。我正在考虑使用矩阵指针数组或矩阵数组。
我发现here 和here 提供的几个答案很有帮助。不过,理想情况下,我想知道一个不需要动态分配的解决方案(参见下面的代码),并且仍然使用数组。
(我发现的结果主要集中在数组的初始化上。我当然想了解更多关于这一点的信息,但也想了解更多关于存储/访问矩阵的信息)。
例如,我想创建一个矩阵(例如 arr[2][2] 和 arr[5[6](不同大小)),然后在需要时存储/访问它们。我为此编写了一个测试代码,但第二部分出现错误。
代码
int main()
{
int** arr1 = calloc(10, sizeof(int*));
for (int i = 0; i < 10; i++)
arr1[i] = calloc(10, sizeof(int));
/* creating simple 2x2 matrix
(in fact, filling part of the 10x10 matrix dynamically allocated) */
arr1[0][0] = 1; arr1[0][1] = 2; arr1[1][0] = 3; arr1[1][1] = 4;
int ***arrayOfMatrices = malloc(sizeof(int**) * 100);
arrayOfMatrices[0] = arr1;
printf("%d\n",arrayOfMatrices[0][1][0]); //outputs 3 as expected
/* 3x3 matrix */
int arr2[3][3];
arr2[0][0] = 5; arr2[0][1] = 6; arr2[1][0] = 7; arr2[1][1] = 8;
arrayOfMatrices[1] = arr2;
printf("%d\n",arrayOfMatrices[1][1][0]);
//test.c:38:24: error: assignment to ‘int **’ from incompatible pointer type ‘int (*)[3]’ [-Werror=incompatible-pointer-types]
return 0;
}
存储矩阵的最佳方法是什么?这种方法有其他替代方法吗?
【问题讨论】:
-
我认为错误说明了一切。您正在尝试将指向 3 个整数数组 (
'int (*)[3]') 的指针分配给指向整数指针 ('int **') 的指针。编译器不会让你这样做。这里的问题(使用 C)是您需要明确分配和释放的所有内存,并且没有强大的内置技术来增加内存。有realloc,但是当你在做数组数组时,这可能会变得很棘手。我不知道最佳 实践,但当我是一名 C 程序员时,我通常会坚持使用 ** 类型来处理 2D 数组,并且非常小心。
标签: arrays c matrix multidimensional-array