在C函数中返回二维数组?

时间:2013-07-05 21:26:05

标签: c multidimensional-array

我已经找了很长时间,但还没有找到满意的解决方案。如何在C函数中返回双维数组?

float **KE()
{
    float K[2][2]={{1,2},{3,4}};
    return K;
}

对于上面的代码,我收到错误

error: cannot convert 'float<*>[2]' to 'float**' in return

2 个答案:

答案 0 :(得分:2)

把它放在一个结构中:

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]);

答案 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);
}