从 C 中的函数返回二维数组

问题描述 投票:0回答:1

我将一个矩阵输入到一个函数中,我想输出它本身的乘法。我无法以正确的格式返回结果。

int **multiplyMatrix(int matrixA[10][10], int matrixB[10][10], int n)
{
    int matrixC[10][10] = { 0 };
    int rowC, columnC = 0;
    int i = 0;
    int* ptr = matrixC;
    for (rowC = 0; rowC < n; rowC++)
    {
        for (columnC = 0; columnC < n; columnC++)
        {
            i = 0;
            for (i = 0; i < n; i++)
            {
                matrixC[rowC][columnC] += matrixA[rowC][i] * matrixB[i][columnC];
            }
        }
    }
    return *ptr;
}

乘法工作正常,如果我在函数中打印矩阵,我会得到正确的结果,但我无法将值返回到 main()

void main()
{
    int n=2;
    int matrixA[10][10] = { 0 };
    int result[10][10] = { 0 };
    
    setMatrix(matrixA, n); // set values from user to the matrix
    printMatrix(matrixA, n); // print matrix in format

    **result = multiplyMatrix(matrixA, matrixA, n);
    printMatrix(result, n);
}

结果中只有result[0][0]的正确值,所有其他值仍然是0。

例如,矩阵 A 的值为 {1,2,3,4},相乘后为 {7,10,15,22},但 main() 中的结果值为 {7,0,0,0}。如何设置multiplyMatrix()中矩阵的其他值以得到结果I main?

c pointers types matrix-multiplication
1个回答
1
投票

你这里有两个问题。

首先,函数的返回类型与您返回的类型不匹配。表达式

*ptr
的类型为
int[10]
,它衰减为
int *
,并且函数返回
int **
。您可能想要返回整个 2D 数组,而不仅仅是其中的一行,因此该函数必须返回
int (*)[10]
,即指向大小为 10 的数组的指针。

这就导致了第二个问题。即使您返回了正确的类型,您也会返回一个指向局部变量的指针。该变量的生命周期在函数返回时结束,并且取消引用指向不再存在的变量的指针会触发未定义的行为

这里最简单的解决方案是将结果数组简单地传递给函数并填充它而不是本地数组。

void multiplyMatrix(int matrixA[10][10], int matrixB[10][10], 
                    int matrixC[10][10], int n)
{
    int rowC, columnC = 0;
    int i = 0;
    int* ptr = matrixC;
    for (rowC = 0; rowC < n; rowC++)
    {
        for (columnC = 0; columnC < n; columnC++)
        {
            i = 0;
            for (i = 0; i < n; i++)
            {
                matrixC[rowC][columnC] += matrixA[rowC][i] * matrixB[i][columnC];
            }
        }
    }
}

int main()
{
    int n=2;
    int matrixA[10][10] = { 0 };
    int result[10][10] = { 0 };
    
    setMatrix(matrixA, n); // set values from user to the matrix
    printMatrix(matrixA, n); // print matrix in format

    multiplyMatrix(matrixA, matrixA, result n);
    printMatrix(result, n);
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.