谈及 C++ 的始化初始化,我们都知道要在变量定义的坑到过时候给它赋初值。确实,也遇在每次定义的始化时候就初始化不仅可以避免脏数据产生,还能增加代码的坑到过可读性。但是也遇,你知道这其中有多少陷阱吗?始化 请看一下代码,你能知道哪些变量的坑到过值是确定的? 打印结果是: 可以看到,三个变量都没有显式初始化,也遇但a,始化c都被赋予了默认值,坑到过而b是也遇不确定的值。 其实我们可以从《C++Primer》中找到答案:“定义于任何函数体之外的始化变量被初始化为0,定义于函数体内部的坑到过内置类型变量将不被初始化”。所谓定义于函数体之外的也遇变量,其实就是全局变量,这里拓展说一下: 初始化过的全局变量,服务器租用由编译器将其保存于静态存储区的data段,并且这样的值越多,程序就越大,操作系统会在程序启动时,将全局变量的值复制到data段中,即完成变量的初始化。 未初始化的全局变量,由编译器保存于静态存储区的bss段,并且这样的值不会被使程序变大,操作系统加载程序时才分配相应的内存,并将bass段清0,即完成变量的初始化。 所以,定义在函数体之外的变量,会被赋默认值。 但定义在函数中的变量,是在栈中分配的内存,属于动态存储区,此区操作系统不会帮助你清0,所以此处定义的网站模板值都是未定义的。 这段代码相信大家平时常写,答案很明显,都是0,但实际的原因,真的是因为{ 0}代表要将每个值设为0吗? 答案是否定的,请看下面的这段代码: 得到的答案是:1,0,0,0,0,0,0,0,0,0,大家注意到了吗?只有第一个值才是1,后面的全是0! 所以,这个坑其实是C++初始化列表的坑,初始化列表的定义中说明,如果初始化列表的数量比定义的数量少,那么未被定义到的源码库值将会被赋予默认值! 大家一定会觉得这段代码很简单,没错,打印结果就是都为0,的确很简单,但是,看下接下来的代码: 是的,变量的类型变了,打印的结果是: 是不是觉得很奇怪,接下来,我们把这句: 改为: 得到的结果是: 是不是感觉很蹊跷? 首先,在我的设备上,int是4字节,所以buff_2总共40字节,memset会对40个1字节赋值0X01,而不是对10个4字节赋值0X01。所以不要用memset对非字符型数组赋初值!陷阱1:默认初始化的坑
陷阱2:数组初始化的坑
int buff[10] = { 0}; for(int i = 0;i<10;i++) { cout<<buff[i]<<endl; } 陷阱3:memset的坑
char buff[10]; memset(buff,0,sizeof(buff)); for(int i = 0;i<10;i++) { printf("%d ",buff[i]); }