为什么代码

void fcn(int *twoDArrayPtr, const int dim1, const int dim2) {
    int (*array)[dim2] = reinterpret_cast<int (*)[dim2]>(twoDArrayPtr);
}

int main() {
    return 0;
}


产生编译器错误

error: cannot initialize a variable of type 'int (*)[dim2]' with
  an rvalue of type 'int (*)[dim2]'


类型是相同的,所以我认为可以执行分配。由于int (*)[dim2]是指向大小为dim2的数组的指针,因此可以是指向该指针可索引的连续内存中一堆大小为dim2的数组的指针,我认为这应该可行。

我在Mac OS / X上使用clang ++,具有以下版本信息:

Apple LLVM版本6.0(clang-600.0.56)(基于LLVM 3.5svn)
目标:x86_64-apple-darwin14.0.0
螺纹型号:posix

最佳答案

dim2不是编译时常量,C ++中不存在VLA(可变长度数组)。其他一些编译器(例如gcc)具有语言扩展,以允许C ++中的VLA,但是clang的行为符合标准。

您可以使用为您执行地址转换的类(或类模板)来解决此问题,例如

// This is very rudimentary, but it's a point to start.
template<typename T>
class array2d_ref {
  public:
    array2d_ref(T *p, std::size_t dim) : data_(p), dim_(dim) { }

    T *operator[](std::size_t i) { return &data_[i * dim_]; }

  private:
    T *data_;
    std::size_t dim_;
};

...

array2d_ref<int> array(twoDArrayPtr, dim2);


但是,除非您在编译时就知道数组的维数,否则恐怕不可能(便携地)拥有指向数组的指针。

10-04 14:41