void *memset(void * s, int ch, size_t n);
功能: 將s指向的一塊連續內存中的前 n 個字節的內容全部設置爲ch指向的ASII值 (ASII值可以用一個字節 8位來表示)
(對應的s指向的元素都是 將 ch代表的ASII值 將數組裏面的元素 以字節爲單位進行賦值(無論該數組元素是char 還是其他int什麼的 )。賦值
一.常見使用memset初始化非char類型數組錯誤
char buff[20];
memset(buffer,0,sizeof(buff) );
以上將buffer數組裏面的元素全部賦值爲0對應的ASII值
誤以爲對s指向的元素全部賦值爲 ch
int num[20];
memset(num,0,sizeof(num) );
這裏將num數組裏面的元素全部賦值爲了 0,但是要注意memset函數的原理;
這裏是將 20*4個字節裏面的內容全部賦值爲0,由於0對應的一個字節二進制碼爲 0000 0000,int變量一般對應4個字節,所以int數組裏面的元素的4個字節全部賦值未 0000 0000 ,那麼int型元素全部賦值爲 0000 0000 0000 0000 0000 0000 0000 0000 對應的數字爲0 達到全部初始化爲0的效果 。
memset(num,0,sizeof(num) ); //錯誤 ,達不到將num裏面的int元素全部賦值爲1
以上的藍色字體已經說過,該函數的賦值過程是以字節未單位的;
所以上面這一行代碼是將 1 對於的ANSII值 (字節 二進制爲0000 0001,即爲1 ) 以該字節單位對數組及裏面的所有元素賦值;
以單個元素爲例子: num[0] 對應的4 個字節 全部賦值爲 0000 0001 那麼num[0] 被賦值爲 0000 0001 0000 0001 0000 0001 0000 0001 ,對應的數爲 2^0 + 2^8 + 2^16 + 2^24 = 16843009 其他元素也全部被賦值爲 16843009 因此達不到全部賦值爲1的結果
因此,只有當 ch 爲 0 或 -1時達到元素全部賦值爲0 或 -1 ,原因 0 對應字節的二進制全部爲0 即0000 0000 ; 1對應的字節二進制全部爲1 即 1111 1111 (補碼)
二.使用memset函數初始化的幾種形式
1.初始化字符數組
char buff[20];
memset(buff,65,sizeof(buff));
將buff裏面的每個字符元素初始爲 3 所對應ASII字符爲 'A'
char buff[20];
memset(buff,'A',sizeof(buff));
將buff裏面的每個字符元素初始爲 'A'2.初始化int整型數組
初始化 只能將 0或者-1 直接賦值爲想要的初始值 具體原因參考上面寫的錯誤
int num[20];
memset(num,0,sizeof(num));
memset(num,-1,sizeof(num));
一般初始化爲0 比較常見 所以採用memset函數進行初始化,如果初始化爲非0或-1 建議使用for循環依次賦值3.初始化結構體類型變量或數組
struct sample_struct
{
char csName[16];
int tiSeq;
int tiType;
};
對於變量
struct sample_struct stTest;
一般情況下,清空stTest的方法
stTest.csName[0] = {'\0'};
stTest.tiSeq = 0;
stTest.tiType = 0;
用memset就非常方便:
memset(&stTest,0,sizeof(struct sample_struct));
如果是數組:
struct sample_struct TSET[10];
memset(TEST,0,sizeof(struct sample_struct) * 10);
例外結構體裏還有數組的話還是需要單獨進行初始化處理的