我已经为此寻找了很长一段时间,但还没有找到令人满意的解决方案。如何在 C 函数中返回一个二维数组?
float **KE()
{
float K[2][2]={{1,2},{3,4}};
return K;
}
对于上面的代码,我得到了错误
error: cannot convert 'float<*>[2]' to 'float**' in return
我已经为此寻找了很长一段时间,但还没有找到令人满意的解决方案。如何在 C 函数中返回一个二维数组?
float **KE()
{
float K[2][2]={{1,2},{3,4}};
return K;
}
对于上面的代码,我得到了错误
error: cannot convert 'float<*>[2]' to 'float**' in return
把它放在一个结构中:
struct dar { float data[2][2]; };
struct dar K()
{
struct dar x = { { { 1, 2 }, { 3, 4 } } };
return x;
}
用法:
struct dar x = K();
printf("%f %f\n", x.data[0][0] + x.data[0][1], x.data[1][0] + x.data[1][1]);
您不能从函数返回数组。数组不可复制。您可以将它包装成 a struct
,但在一般情况下,按值传递一个可能很大的对象并不是一个好主意。
您可以做的是从函数返回指向数组的指针。但是为此,您必须确保指针指向的对象在函数退出时继续存在。一个流行的习惯用法是从调用者代码中传递目标数组并将其填充到函数中
float (*KE)(float (*dst)[2][2])[2][2]
{
(*dst)[0][0] = 1;
(*dst)[0][1] = 2;
(*dst)[1][0] = 3;
(*dst)[1][1] = 4;
return dst;
}
...
float array[2][2];
KE(&array);
请注意,在这种情况下,不必从函数返回指向数组的指针,因为调用者已经知道结果数组。但是我还是这样做是为了使函数声明语法进一步复杂化并使其更难阅读。
您始终可以通过为数组类型定义 typedef 名称来对其进行去混淆
typedef float F22[2][2];
F22* KE(F22* dst)
{
...
}
或者,为了保持聚合初始化语法的简洁性,您可以将函数体实现为
F22* KE(F22* dst)
{
const F22 K = { {1, 2}, {3, 4} };
memcpy(dst, &K, sizeof *dst);
return dst;
}
甚至作为
F22* KE(F22* dst)
{
return memcpy(dst, &(const F22) { {1, 2}, {3, 4} }, sizeof *dst);
}