C++ 11为什么cout从布尔数组中打印大整数?

Ala*_*lan 1 c++ cout

#include <iostream>
using namespace std;

int main() {
    bool *a = new bool[10];

    cout << sizeof(bool) << endl;
    cout << sizeof(a[0]) << endl;

    for (int i = 0; i < 10; i++) {
        cout << a[i] << " ";
    }

    delete[] a;
}
Run Code Online (Sandbox Code Playgroud)

以上代码输出:

1
1
112 104 151 0 0 0 0 0 88 1 
Run Code Online (Sandbox Code Playgroud)

最后一行应该包含垃圾值,但为什么它们不是全部为0或1?堆栈分配的数组也会发生同样的事情.

解决:我忘了sizeof计算字节数,而不是像我想象的那样.

0x4*_*2D2 6

你有一个默认初始化bool的数组.原始类型的默认初始化不需要初始化,因此它们都具有不确定的值.

您可以通过提供一对括号来对它们进行零初始化:

bool *a = new bool[10]();
Run Code Online (Sandbox Code Playgroud)

布尔值是1字节的整数类型,所以你看到这个输出的原因可能是因为那是当时堆栈上可以用单个字节查看的数据.注意它们是255以下的值(可以从无符号1字节整数产生的最大数字).

OTOH,打印出一个不确定的值是Undefined Behavior,所以在这个程序中没有任何逻辑可供考虑.