void *memset(void *s, int ch, size_t n);
作用:將s所指向的某一塊內存中的每個字節的內容全部設置為ch指定的ASCII值, 塊的大小由第三個參數指定,這個函數通常為新申請的內存做初始化工作。
不知道有沒有像我一樣把memset當作萬能的初始化工具,例如:
int arr[n];
memset(arr,1,n*sizeof(int));
這樣得到的arr數組一定不是全0,而是16843009,下面解釋原因。
首先,變量類型的本質只是標志從某一內存地址開始讀取的位數,強制轉換就是改變讀取位數的大小。
void *(memset) (void *s,int c,size_t n)
{
const unsigned char uc = c;
unsigned char *su;
for(su = s;0 < n;++su,--n)
*su = uc;
return s;
}
const unsigned char uc = c; 把int類型的c轉換成unsigned char類型,意味着截去c的高24位,只保留低8位。unsigned char *su; 把s當作unsigned char*類型,也就是說su中的每一個元素按8位計算。
c的二進制 : 00000000000000000000000000000001(32位)
1、c轉換為unsigned char 后:00000001(8位)
2、將指針su(unsigned char類型)的每一元素(8位)賦值為00000001,循環4n次。
3、memset()結束后,arr的每個元素按照int類型讀取,讀出來的就是1000000010000000100000001,十進制就是16843009。