这段代码是否创建了2D数组?

时间:2015-01-27 08:27:55

标签: c++ arrays

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代码在做什么,以及如何获得所需的效果?

2 个答案:

答案 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)初始化指针指针。如果您已经适当地进行了分配,那么可以复制数据 - 您还没有。