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

我想用new运算符来分配一个2d数组。这是我的函数new2d。为什么2D动态数组" title="动态数组">动态数组有初始值?

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

为什么会出现这种情况?

回答:

默认初始化可能会导致不确定的值。

1)时具有自动,静态的,或线程本地存储持续时间的变量声明不具有初始:从0​​

缺省初始化引用在三种情况下进行的。

2)当具有动态存储持续时间的对象由没有初始化的新表达式创建时,或者当初始化器由一对空括号组成的新表达式创建时(直到C++ 03 )。 3)在构造函数初始值设定项列表中没有提及基类或非静态数据成员,并且调用该构造函数时。

缺省初始化的效果是:

如果T是一个非POD(直到C++ 11)类型,构造函数被认为是与进行过载靠在空参数列表的分辨率。

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

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

在你的情况,你满足条件2

回答:

看来以后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]

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

以上是 为什么2D动态数组有初始值? 的全部内容, 来源链接: utcz.com/qa/264634.html

回到顶部