C++11 为什么 cout 从布尔数组打印大整数?
C++11 Why does cout print large integers from a boolean array?
#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;
}
以上代码输出:
1
1
112 104 151 0 0 0 0 0 88 1
最后一行应该是垃圾值,但为什么不全是0或1?堆栈分配的数组也会发生同样的事情。
已解决:我忘记了 sizeof 计算字节,而不是我想的位。
您有一组默认初始化的 bool
。基本类型的默认初始化不需要初始化,因此它们都有不确定的值。
您可以通过提供一对括号将它们零初始化:
bool *a = new bool[10]();
布尔值是 1 字节整数类型,所以您看到此输出的原因可能是因为那是当时堆栈上可以用单个字节查看的数据。请注意它们是如何小于 255(可以从无符号 1 字节整数生成的最大数字)的值。
OTOH,打印出一个不确定的值是未定义的行为,所以这个程序真的没有考虑逻辑。
您看到的是未初始化的值,不同的编译器生成不同的代码。 On GCC I see everything as 0 windows 我看到垃圾值。
通常 char 是可寻址的最小字节 - 即使 bool 具有 1/0 值 - 内存访问明智它将是一个 char。因此你永远不会看到大于 255
的垃圾值
初始化之后(memset 为您修复这些问题)
#include <iostream>
using namespace std;
int main() {
bool* a = new bool[10];
memset(a, 0, 10*sizeof(bool));
cout << sizeof(bool) << endl;
cout << sizeof(a[0]) << endl;
for (int i = 0; i < 10; ++i)
{
bool b = a[i];
cout << b << " ";
}
return 0;
}
正式地说,正如answer中所指出的,读取任何未初始化的变量都是未定义的行为,这基本上意味着一切皆有可能。
更实际的是,那些布尔值使用的内存充满了你所说的垃圾。 ostreams operator<< inserts booleans via std::num_put::put(),如果未设置 boolalpha,则将存在的值转换为 int 并输出结果。
sizeof(bool)
在你的机器上 returns 1
.
那是 1 byte,不是 1 bit,所以你显示的值当然可以存在。
我不知道你为什么在变量 a 前加一个 * 号。
是指向数组首元素地址的指针吗?
#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;
}
以上代码输出:
1
1
112 104 151 0 0 0 0 0 88 1
最后一行应该是垃圾值,但为什么不全是0或1?堆栈分配的数组也会发生同样的事情。
已解决:我忘记了 sizeof 计算字节,而不是我想的位。
您有一组默认初始化的 bool
。基本类型的默认初始化不需要初始化,因此它们都有不确定的值。
您可以通过提供一对括号将它们零初始化:
bool *a = new bool[10]();
布尔值是 1 字节整数类型,所以您看到此输出的原因可能是因为那是当时堆栈上可以用单个字节查看的数据。请注意它们是如何小于 255(可以从无符号 1 字节整数生成的最大数字)的值。
OTOH,打印出一个不确定的值是未定义的行为,所以这个程序真的没有考虑逻辑。
您看到的是未初始化的值,不同的编译器生成不同的代码。 On GCC I see everything as 0 windows 我看到垃圾值。
通常 char 是可寻址的最小字节 - 即使 bool 具有 1/0 值 - 内存访问明智它将是一个 char。因此你永远不会看到大于 255
的垃圾值初始化之后(memset 为您修复这些问题)
#include <iostream>
using namespace std;
int main() {
bool* a = new bool[10];
memset(a, 0, 10*sizeof(bool));
cout << sizeof(bool) << endl;
cout << sizeof(a[0]) << endl;
for (int i = 0; i < 10; ++i)
{
bool b = a[i];
cout << b << " ";
}
return 0;
}
正式地说,正如answer中所指出的,读取任何未初始化的变量都是未定义的行为,这基本上意味着一切皆有可能。
更实际的是,那些布尔值使用的内存充满了你所说的垃圾。 ostreams operator<< inserts booleans via std::num_put::put(),如果未设置 boolalpha,则将存在的值转换为 int 并输出结果。
sizeof(bool)
在你的机器上 returns 1
.
那是 1 byte,不是 1 bit,所以你显示的值当然可以存在。
我不知道你为什么在变量 a 前加一个 * 号。 是指向数组首元素地址的指针吗?