-
定义在函数体内的内置类型的对象(局部变量),如果没有显示初始化,则其值是未定义的,访问它是危险的
int a2[10];
-
如果使用static修饰(局部静态变量),则会自动初始化成默认值0
static int a4[10];
-
或者手动初始化,初始化个数小于数组长度的,剩余元素会自动初始化成默认值0
int a3[10] = {1};
-
全局变量的内置类型会自定初始化为默认值0,
int a[10];
memset 初始化数组的误区
-
memset 是按字节对内存块进行初始化的函数,用来给某一块内存空间进行赋值的;
-
memset 作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法;
-
成员变量可以是简单的内置类型(short、int、long、char、float、double);
-
memset函数不能将int数组初始化为0和-1之外的其他值(除非该值高字节和低字节相同):
memset是逐字节进行初始化,比如对整型数进行初始化,int是32位的共四个字节,每个字节设置为n,则
如果n=1,1为00000001 00000001 00000001 00000001,转为十进制数是1+128+1*216+12^24=16843009,而不是1;
如果n=0,0为 00000000 00000000 00000000 00000000,转化为十进制为0;
如果n=-1,-1为 11111111 11111111 11111111 11111111(原码的反码的补码),转化后为-1。
int a[10];
void test(){
int a2[10];
int a3[10] = {1};
static int a4[10];
for(int i=0;i<10;i++)
cout<<a[i]<<" ";
cout<<endl;
for(int i=0;i<10;i++)
cout<<a2[i]<<" ";
cout<<endl;
for(int i=0;i<10;i++)
cout<<a3[i]<<" ";
cout<<endl;
for(int i=0;i<10;i++)
cout<<a4[i]<<" ";
cout<<endl;
int a5[10];
memset(a5,1,10*sizeof(int));
for(int i=0;i<10;i++)
cout<<a5[i]<<" ";
cout<<endl;
}
/* 对应的输出 a a2 a3 a4 0 0 0 0 0 0 0 0 0 0 -442629216 32766 170005253 1 -442629216 32766 -442628816 32766 10 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 */