为什么2d动态数组有初始值?

时间:2015-07-21 21:51:05

标签: c++ arrays constructor initialization new-operator

我正在尝试使用new运算符来分配2d数组。这是我的函数new2d。

int** new2d(int r, int c)
{
    int **t = new int*[r];
    for(int i = 0; i < r; i++)
        t[i] = new int[c];
    return t;
}

我很确定这是正确的方法。但是,当我尝试打印如下所示的数组时

int **a = new2d(5, 9);
for(int i = 0; i < 5; i++)
{
    for(int j = 0; j < 9; j++)
    {
        cout << a[i][j] << " ";
    }
    cout << endl;
}

它给出了这个奇怪的输出随机13,10,7 ...

0 0 0 0 13 0 0 0 0 
0 0 0 0 10 0 0 0 0 
0 0 0 0 7 0 0 0 0 
0 0 0 0 4 0 0 0 0 
0 0 0 0 0 0 0 0 0 

为什么会这样?

2 个答案:

答案 0 :(得分:1)

默认初始化可能导致不确定的值。引自http://en.cppreference.com/w/cpp/language/default_initialization

  

默认初始化在以下三种情况下执行:

     

1)声明具有自动,静态或线程局部存储持续时间的变量时,没有初始化器。

     

2)具有动态存储持续时间的对象是由没有初始化程序的new-expression创建的,或者是由new-expression创建的对象,初始化程序由一对空括号组成(直到C ++ 03)

     

3)在构造函数初始值设定项列表中未提及基类或非静态数据成员且调用该构造函数时。

     

默认初始化的效果是:

     

如果T是非POD(直到C ++ 11)类类型,则考虑构造函数并对空参数列表进行重载解析。

     

调用所选的构造函数(它是默认构造函数之一)以提供新对象的初始值。

     

如果T是数组类型,则数组的每个元素都是默认初始化的。   否则,什么都不做:具有自动存储持续时间的对象(及其子对象)被初始化为不确定值。

在您的情况下,您符合条件2。

答案 1 :(得分:0)

似乎你没有在t[i] = new int[c];之后初始化数组 但是,这不是创建数组的最佳方式。这是一个更大的讨论 How do I declare a 2d array in C++ using new?

好。通常最好使用诸如

之类的方法
int *array = new int[sizeX*sizeY];
然后将

ary[i][j]重写为array[i*sizeY+j]

是的,最好是阅读大讨论,理解+和 - 更好