memset()的使用注意

     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);

  例外結構體裏還有數組的話還是需要單獨進行初始化處理的


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章