MyClass.hxx
class MyClass{
private:
int ** myArray;
};
MyClass.cxx
void MyClass::setArray()
{
int arraySize = 10;
myArray = new int*[arraySize]
for (int i = 0; i < 2; ++i) {
myArray[i] = new int[arraySize]
}
}
我的问题是,此代码是否创建了一个2D数组,在一个方向上约束到两个项目,并在另一个中由arraySize约束,类似于:
int const exampleArray[][2]{
{ 1 , 1 }
{ 1 , 1 }
{ ... , ... }
}
我目前能够在创建后(第一种方式)写入数组,但是对于我可以写入数组的距离有“未定义”行为。
所以我的问题是,MyClass代码在做什么,以及如何获得所需的效果?
答案 0 :(得分:2)
这段代码是否创建了一个方向约束为两个项目的2D数组,并通过arraySize约束另一个?
没有。它分配一个长度为arraySize
的指针数组。前两个指针指向动态分配的长度为leapSecondSize
的数组的第一个元素。其余指针未初始化。
除了动态初始化之外,还有一个重要的区别。一个二维数组:一个指针数组可以看起来像一个二维数组,因为每个指针都可以指向一维数组的开头。但是数据不在一个连续的块中,并且没有限制指针指向数组的元素:它们可以为null,它们可以指向单个对象,它们甚至可以是未初始化的。
答案 1 :(得分:1)
这取决于&#34; 2D阵列的含义&#34;。
如果你的意思是数组数组的正常概念,比如
int array[10][2];
然后答案是&#34;没有&#34;。如果你的意思是符号
myArray[3][2] = 42;
会起作用,然后答案是一个沉默的是。这只是模仿数组数组的行为,假设两个级别的内存分配正确完成。需要注意的是,实际内存的布局与真正的数组数组不同。
阵列尺寸不匹配会产生皱纹。代码中的myArray被动态分配为一个包含10个指针的数组。该循环仅将前两个指针(myArray [0]和myArray [1])设置为(动态分配)int数组。任何使用myArray [3]的尝试都会给出未定义的行为,因为myArray [3]到myArray [9]都没有初始化。
通常也不可能使用数组初始化器(例如exampleArray)初始化指针指针。如果您已经适当地进行了分配,那么可以复制数据 - 您还没有。