1. 程式人生 > >memset初始化問題

memset初始化問題

memset填充方式是以1位元組為單位對記憶體進行填充,對於陣列進行初始化

int a[2];
    memset(a,0,sizeof(a));
    for(int i=0; i<2; i++)
    {
        cout<<a[i]<<' ';
    }
    cout<<endl;
    memset(a,-1,sizeof(a));
    for(int i=0; i<2; i++)
    {
        cout<<a[i]<<' ';
    }
    cout<<endl;
    memset(a,1,sizeof(a));
    for(int i=0; i<2; i++)
    {
        cout<<a[i]<<' ';
    }
    cout<<endl;

猜猜執行結果?


可以看到memset成功對陣列進行了0與-1的初始話,可是為什麼1卻不行呢,這就要用到上面提到的memset的工作方式了,首先,int型別的整數在計算機中的儲存方式為補碼,4位元組。

未初始化預設儲存為

00000000 00000000 00000000 00000000

按0初始化,以為原本預設值就是0,所以還是原來的情況

按1初始化

00000001 00000001 00000001 00000001

將每一個位元組均賦值為1,由於正數補碼與原碼相同,所以得到了如圖所示的結果

按-1初始化,將每一個位元組初始化為-1

11111111 11111111 11111111 11111111

可以發現經過補碼到原始碼的變換後,原碼為

10000000 00000000 00000000 00000001

這恰恰是-1的原碼,所以對於0和-1的初始化成功純屬巧合,而對於其他數像1等就無法做到