我在使用C ++创建2D动态数组时遇到问题。我希望它具有动态数字(例如numR)的“行”和固定的(例如2)数量的“列”。
我尝试这样做:
const numC = 2;
int numR;
numR = 10;
double *myArray[numC];
myArray = new double[numR];
不幸的是,它不起作用。是否有可能以这种方式做到这一点?
当然我可以使用double **myArray
并初始化它,好像两个维度都是动态的(将numC用作循环中的限制器)但我想尽可能避免使用它。
提前致谢。
答案 0 :(得分:6)
是否可以这样做?
是:
double (*myArray)[numC] = new double[numR][numC];
// ...
delete[] myArray;
这可能看起来有点不寻常,但5.3.4§5明确指出:
new int[i][10]
的类型为int (*)[10]
请注意,许多程序员不熟悉C声明符语法,也不会理解此代码。此外,手动动态分配也不例外。对于这些方法,数组向量更好:
#include <vector>
#include <array>
std::vector<std::array<double, numC> > vec(numR);
// ...
// no manual cleanup necessary
将std::array
替换为std::tr1::array
或boost::array
,具体取决于您的编译器。
答案 1 :(得分:2)
为什么不使用std::vector,并利用其constructor:
std::vector<std::vector<int> > my2Darray(2, std::vector<int>(10));
my2Darray[0][0] = 2;
答案 2 :(得分:1)
需要有一个循环,因为你需要为每一列创建一个数组。
我认为你所追求的是:
double *myArray[numC];
for (int i = 0; i < numC; i++) {
myArray[i] = new double[numR];
}
// some code...
// Cleanup:
for (int i = 0; i < numC; i++) {
delete [] myArray[i];
}
这声明了一个带有double
元素的指针数组(到numC
),然后为{{1}中的每一列创建一个double
个数组,其中包含numR
个元素}}。不要忘记在完成内存后释放内存,否则会导致内存泄漏。
答案 3 :(得分:-1)
您的索引应该是行,然后是列。
double** myArray = new double*[numR];
for( unsigned int i = 0; i < numR; i++ ) {
myArray[i] = new double[numC];
}
访问第2行第5列:
myArray[2][5];