看到C++将数组初始化为全0的这个用法:

int a[100] = {0};// 初始化一个全0的数组

你可能会举一反三,使用如下代码来初始化一个全1数组

int a[100] = {1};

但是这句代码的执行结果是:得到一个第一个数为1,其他数全部为0的数组。感觉非常坑爹。
究其原因,正如C/C++ int数组初始化中所述,数组初始化列表中的元素个数小于指定的数组长度时,不足的元素补以默认值。
这个结论在bool数组的初始化中同样适用:

bool b[100] = {false};// 初始化一个全为false的数组
bool b[100] = {true};// 初始化一个b[0]为true,其他为false的数组

还是用memset来进行初始化比较好:

//int a[100];
//memset(a, 1, sizeof(a));// 不能初始化一个全1的数组
bool b[100];
memset(b, true, sizeof(b));// 可以初始化一个全为true的数组

感谢评论区@Mreak233的指正,使用memset(a, 1, sizeof(a))并不能初始化一个全1的数组,实际运行之后,数组中的每个值都是16843009,即二进制的00000001 00000001 00000001 00000001
引用关于C++ memset函数使用的问题中的 【3.挖掘背后的原因】中的话,其原因在于

为什么使用memset函数会出现这些情况呢?原因很简单就是由于memset函数在做初始化的时候是以字节为单位的(1Byte,也就是8位二进制数)。由于bool类型和char类型均为1个字节。所以在进行初始化的时候不会发生任何问题(bool类型在存入数组是会进行类型转换,0为false,非0为true)。但是一个int型变量是4个字节,也就是32位二进制数。那么在初始化时会将4个用于初始化的字符组合成一个int型的值。

如果要将int数组全部初始化为一个非0数的话,建议使用for循环进行赋值。https://bbs.csdn.net/topics/360017909

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐