为什么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