为什么代码
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);
但是,除非您在编译时就知道数组的维数,否则恐怕不可能(便携地)拥有指向数组的指针。