【问题标题】:Best way to store multiple matrices in C?在 C 中存储多个矩阵的最佳方法?
【发布时间】:2022-01-12 01:08:32
【问题描述】:

我正在编写一个 C 程序,该程序需要我访问和存储不同大小的矩阵(二维数组)以供将来操作。我正在考虑使用矩阵指针数组或矩阵数组。

我发现herehere 提供的几个答案很有帮助。不过,理想情况下,我想知道一个不需要动态分配的解决方案(参见下面的代码),并且仍然使用数组。

(我发现的结果主要集中在数组的初始化上。我当然想了解更多关于这一点的信息,但也想了解更多关于存储/访问矩阵的信息)。

例如,我想创建一个矩阵(例如 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


【解决方案1】:

这样的指向数组的指针怎么样?

int main()
{
    int m3[4][5][6];
    int (*ptom3)[5][6] = m3;
    m3[1][1][1] = 27;
    printf("%d\n",((ptom3)[1][1][1]));//prints 27 as expected
    return 0;
}

【讨论】:

    猜你喜欢
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    相关资源
    最近更新 更多