int数组初始化为全0和全1,bool数组初始化为全false和全true

2022-06-24 08:59:59

看到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

  • 作者:爱兜风
  • 原文链接:https://blog.csdn.net/qq_38989148/article/details/105972523
    更新时间:2022-06-24 08:59:59