如何在 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 中返回二维数组?的主要内容,如果未能解决你的问题,请参考以下文章