在 C++ 中的数组中未默认初始化的索引范围
Posted
技术标签:
【中文标题】在 C++ 中的数组中未默认初始化的索引范围【英文标题】:Range of indexes not default initialized in arrays in 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。
谁能帮我弄清楚我哪里出错了?
【问题讨论】:
【参考方案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
的所有元素的值都是不确定的值。
【讨论】:
以上是关于在 C++ 中的数组中未默认初始化的索引范围的主要内容,如果未能解决你的问题,请参考以下文章