为什么二维动态数组有初始值
Why 2d dynamic array has initial values?
我试图使用新的操作符来分配一个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]
。
是的,最好阅读大讨论,更好地理解+和-
相关文章:
- std::向量与传递值的动态数组
- 将数组动态分配到具有指针参数的函数中
- 我可以以某种方式使我的矢量/数组动态更改装置数量吗?
- 使用 new: "potentially uninitialized pointer"将对象数组动态分配给指针
- 为什么C 没有方便的方式来为多维数组动态分配内存
- 如何制作具有动态大小的数组?动态数组的一般用法(可能还有指针)
- c++中的数组动态内存分配
- 多维数组动态分配的内存图
- 如何在 c++ 中使用 2-D 固定数组为 4-D 数组动态分配内存
- C++ 我在数组/动态内存方面遇到了一些问题
- C++ 中从数组动态强制转换
- C++中高维数组动态内存分配的正确方法.
- 从 C++ 结构中包含的指针数组动态分配和访问内存
- 对象数组动态内存分配
- 为二维数组动态分配内存时出错
- 如何将2d数组动态分配给结构
- 为结构数组c++动态分配内存
- 将数组动态添加到多维数组
- 类中的类数组-动态数组(c++)有问题
- 分配对象数组动态冻结