在 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++ 中的数组中未默认初始化的索引范围的主要内容,如果未能解决你的问题,请参考以下文章

在 matlab 到 C++ 的转换中未正确设置二维数组

C++ 11特性

C++ 11特性

C++中的稀疏数组

Clang 没有报告 C++ 中未初始化的变量?

c++ 对象正在创建同一个数组的两个实例,但在不同的范围内?