如何在 C 中返回二维数组?

Posted

技术标签:

【中文标题】如何在 C 中返回二维数组?【英文标题】:How do I return a 2D array in C? 【发布时间】:2022-01-16 03:44:09 【问题描述】:

我有一个在函数中构造的数组。我想返回数组并将值存储在另一个数组中。不知何故,它不起作用。它没有显示任何类型的错误,但它不起作用。


int** matrixMultiplier(int A[2][2], int B[2][2], int dimension)
    
    int p, q, r, s, t, u, v, i, j;
    int C[2][2];
    
    p = (A[0][0] + A[1][1]) * (B[0][0] + B[1][1]);
    q = (A[1][0] + A[1][1]) * B[0][0];
    r = A[0][0]*(B[0][1] - B[1][1]);
    s = A[1][1]*(B[1][0] - B[0][0]);
    t = (A[0][0] + A[0][1]) * B[1][1];
    u = (A[1][0] - A[0][0]) * (B[0][0] + B[0][1]);
    v = (A[0][1] - A[1][1]) * (B[1][0]+B[1][1]);

    C[0][0] = p+s-t+v;
    C[0][1] = r+t;
    C[1][0] = q+s;
    C[1][1] = p-q+r+u;

    return C;



void main()

    int A[2][2] = 2, 3,
                   4, 5;
    int B[2][2] = 4, 3,
                   7, 8;
    
    int p, q, r, s, t, u, v, i, j;
    int **C = matrixMultiplier(A, B, 2);
    

    for(i = 0; i<2; i++)
        for(j=0; j<2; j++)
            printf("%d\t", C[i][j]);
        
        printf("\n");
    

```

【问题讨论】:

请参阅Function returning address of local variable error in C。相反,在调用者的代码中定义int C[2][2],并将其添加为另一个函数参数,并将printf("%d\t", **C)更改为printf("%d\t", C[i][j]) 【参考方案1】:

您的程序在编译时会给出多个警告:

prog.c: In function ‘matrixMultiplier’:
prog.c:19:12: warning: return from incompatible pointer type [-Wincompatible-pointer-types]
     return C;
            ^
prog.c:19:12: warning: function returns address of local variable [-Wreturn-local-addr]

这是两个主要的,并显示您的错误。

第一个显示了关于“二维数组”是什么的基本混淆。这是 C 语言中的一个常见问题,因为它没有“二维数组”的固定概念。相反,它有数组和指针,它们是两种不同的东西,并且是可组合的。特别是,您可以拥有一个数组数组(您已将 C 声明为),它可以像 2D 数组一样工作,您还可以拥有完全不同的指向数组的指针数组,它也可以像 2D 数组一样工作并且看起来成为你想要回归的东西。但是由于“数组数组”和“指针数组”是两个不同的不兼容的东西,你不能这样做。您可以通过将返回类型更改为 int (*)[2] 来解决此问题,这可以通过 typedef 轻松完成:

typedef int (*matrix)[2];
matrix matrixMultiplier(int A[2][2], int B[2][2], int dimension) 

也可以直接做

int (*matrixMultiplier(int A[2][2], int B[2][2], int dimension))[2] 

后一种语法非常不透明,这就是为什么建议使用 typedef 使其更清晰的原因。

然后你有第二个问题——返回一个指向局部变量的指针(它超出了范围,所以指针悬空)。要解决这个问题,您需要返回一个指针,该指针指向函数返回后将继续存在的东西。您可以使用 malloc 来做到这一点(而不是使用本地 var):

int (*C)[2] = malloc(2*2*sizeof(int));

或者你可以制作 C static

static int C[2][2];

在这种情况下,每次调用函数都会创建和重用一个 C 对象。

【讨论】:

以上是关于如何在 C 中返回二维数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C 中返回二维数组?

如何使c ++将二维数组返回给python

C ++通过访问器函数返回私有二维数组

如何从函数返回矩阵(二维数组)? (C)

c++返回二维数组的最大元素和它所在的行、列号?

C语言中如何定义一个二维数组,数组长度由输入值确定?