为多维数组分配内存

时间:2014-11-01 13:12:45

标签: c++ arrays

我想将数组A,B相乘。这些阵列具有固定的大小。我用模板推断出它们的大小。现在我想为C分配一些等于A * B的内存。我的问题是,当我这样做时(N = 3,L = 5)

int (*C)[N][L] = new int[N][L]

我得到了

error: cannot convert ‘int (*)[5]’ to ‘int (*)[3][5]’ in initialization

我做了一个解决方法,但仍然想知道如果没有解决方法我该怎么办呢。

template<int N, int K>
struct matrix {
  int array[N][K];
};

template<int N, int K, int L>
int (&multiply(int (&A)[N][K], int (&B)[K][L]))[N][L] {

  matrix<N,L> *mat = new matrix<N,L>();
  int (&C)[N][L] = mat->array;

  return C;
}

int main() {
  int A[3][4];
  int B[4][5];

  int (&C)[3][5] = multiply(A, B);
}

您可以使用typedefreinterpreted_cast制作其他解决方案,但为什么需要它们?这就像c ++本身的失败,语言未能兑现承诺。它类似于Java中的泛型。您认为像List<T>这样的容器会更好地了解但是它们在使用转换和@SuppressWarnings时遵循相同的错误方式。

1 个答案:

答案 0 :(得分:1)

的问题
int (*C)[N][L] = new int[N][L];

new T[n]返回指向T的指针。已分配数组的事实在返回类型中不可见。因此,表达式new int[N][L]返回指向L的大小 - int数组的指针。这是LHS所需的类型:

int (*C)[L] = new int[N][L];