【问题标题】:Range of indexes not default initialized in arrays in C++在 C++ 中的数组中未默认初始化的索引范围
【发布时间】:2018-07-01 05:53:31
【问题描述】:
以下是我要运行的代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
bool x[101010];
for(int i=0;i<101010;i++)
{
if(x[i])
cout<<i<<" ";
}
return 0;
}
据我所知,布尔类型变量的默认值为false。但是,对于索引 94758-101008 中的上述代码,i 的值正在打印,这意味着它们默认初始化为 true。
谁能帮我弄清楚我哪里出错了?
【问题讨论】:
标签:
c++
arrays
initialization
【解决方案1】:
您的问题可以简化为:
bool x;
std::cout << x;
布尔值是一种基本类型。基本类型的默认初始化自动变量使它们具有不确定的值。不是false,而是不确定的。使用这些值会导致未定义的行为。这就是你所看到的。
您看到随机值的原因是“幕后”布尔值是一种整数类型,编译器只强制使用两个值。但如果你不明确地初始化它,你会得到任何随机的垃圾内存。
解决方案是显式值初始化您的变量。对于一个数组,它看起来像这样:
bool x[101010]{};
这将递归地初始化数组的每个元素,并初始化一个bool确实将它设置为false。
【解决方案2】:
布尔类型变量的默认值为false。
这里不是真的。对于default initialization,
- 如果 T 是
non-POD (until C++11) 类类型,则考虑构造函数并针对空参数列表进行重载决策。调用选择的构造函数(默认构造函数之一)为新对象提供初始值;
- 如果 T 是数组类型,则数组的每个元素都是默认初始化的;
- 否则,什么都不做:具有自动存储持续时间的对象(及其子对象)被初始化为不确定的值。
x被声明为具有自动存储时长的本地对象,它是一个非类类型的数组;那么x的所有元素的值都是不确定的值。