在C函数中返回二维数组?
我已经找了很长时间,但还没找到满意的解决方案。 如何在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]);
您无法从函数返回数组。 数组不可复制。 您可以将其包装到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); }