为二维数组动态分配缓冲区空间 - 为什么会失败?

时间:2014-03-09 22:27:31

标签: c++ arrays pointers types multidimensional-array

我在C ++多维数组指针地狱中。我有一个函数,它指向两个多维数组的两个指针。该函数将输入数组转换为输出数组。

void transpose(float * in, float * out) throw() {
  size_t numvars = dataset.getVariables().size()
  size_t numsegs = dataset.getSegments().size();
  ...

我无法为输出数组动态分配缓冲区。我认为以下内容可行,因为数组会自动衰减为指针:

size_t numvars = dataset.getVariables().size()
size_t numsegs = dataset.getSegments().size();
float tData[numvars][numsegs];
transpose(data, tData);

但我收到错误:

  

参数2的已知转换来自'float [(((sizetype)(((ssizetype)numvars)+ -1))+ 1)] [(((sizetype)(((ssizetype)numsegs)+ -1 ))+ 1)]'到'浮动*'

那为什么会失败呢?什么是动态分配二维数组大小的正确/最佳方法,以便transpose函数可以做到这一点?

1 个答案:

答案 0 :(得分:2)

void transpose(float * in, float * out)
...
float tData[numvars][numsegs];
transpose(data, tData);

tData的类型为float[numvars][numsegs],只能衰减到float (*)[numsegs] 如果out需要此2D数组中第一个元素的地址,那么您可以执行以下操作:

transpose(data, &tData[0][0]);

即:

void foo(float* pF){}

int main()
{
    float f, arr[10], arr2d[5][7];

    foo(&f);            // perfectly straightforward
    foo(arr);           // float[10] decays to float*
    foo(arr2d[0]);      // float[7] decays to float*

    foo(&arr2d[0][0]);  // perfectly straightforward
    foo(arr2d);         // float[5][7] decays to float (*) [7] ~> float* ???
                        // ERROR: can't convert decayed float (*) [7] to float *
}

另请注意,float tData[numvars][numsegs];不会“动态分配”数组。它是一个具有自动存储持续时间的可变长度数组(a.k.a.VLA)。


但是,您可以考虑使用std::vector而不是基于指针的C风格方法:

typedef std::vector<std::vector<float> > FloatMatrix;

void transpose(const FloatMatrix& in, FloatMatrix& out);
...
FloatMatrix data;
...
FloatMatrix fm = FloatMatrix(numvars, std::vector<float>(numsegs));
transpose(data, fm);