为什么二维动态数组有初始值

Why 2d dynamic array has initial values?

本文关键字:数组 动态 二维 为什么      更新时间:2023-10-16

我试图使用新的操作符来分配一个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 

为什么会发生这种情况?

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

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

1)当声明具有自动、静态或线程本地存储持续时间的变量而没有初始化式时。

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

3)在构造函数初始化列表中没有提到基类或非静态数据成员,并且调用该构造函数时

默认初始化的效果:

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

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

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

在你的例子中,你满足条件2

似乎您没有在t[i] = new int[c];后初始化数组然而,这不是创建数组的最佳方式。这里有一个更大的讨论如何在c++中使用new声明2d数组?

。通常使用

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

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

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