• 定义在函数体内的内置类型的对象(局部变量),如果没有显示初始化,则其值是未定义的,访问它是危险的int a2[10];

  • 如果使用static修饰(局部静态变量),则会自动初始化成默认值0 static int a4[10];

  • 或者手动初始化,初始化个数小于数组长度的,剩余元素会自动初始化成默认值0 int a3[10] = {1};

  • 全局变量的内置类型会自定初始化为默认值0,int a[10];

memset 初始化数组的误区
  1. memset 是按字节对内存块进行初始化的函数,用来给某一块内存空间进行赋值的;

  2. memset 作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法;

  3. 成员变量可以是简单的内置类型(short、int、long、char、float、double);

  4. 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 */