linux中memset的正確用法


linux中memset的正確用法

      【起因】希望對各種類型的數組進行初始化,避免野值

      【函數頭文件】 疑問提示:在linux中可以在terminal中輸入 "man memset"進行查詢

        #include
        void *memset(void *s, int c, size_t n);

      【使用說明】 The  memset()  function  fills  the  first  n  bytes of the memory area  pointed to by s with the constant byte c.
      【錯誤用法】
        int array[10];
        memset(array,1,10);//或者memset(array,1,sizeof(array)),都是不對的!

      【解釋】
       之前一直不明白為什么memset這個函數的頭文件是 "string.h",看完下面的內容,你就會明白了。

       memset函數使用說明中提到的是按照byte來填充。

       舉例來說
       char arr[10]; memset(arr,'a',10);
       由於char只占一個字節(byte),因此函數的結果是將連續的10個字節都填充為'a'。這是我們所期待的結果!

       int arr[10];memset(arr,1,10);
       由於int占4個字節(byte),因此"1"對應的二進制(32bits下)為"00000000000000000000000000000001"(4bytes),塞到1byte(8bit)的中,高位被舍棄了。所以,填入數組中的值是"00000001"。然而總共有10*4=40個byte,卻只有10個byte被填充,因此結果是"00000001……00000001**********"(前面總共10個"00000001")。因此,第一個數是"0x01010101"=16843009(10進制)數組其余部分的值則是隨機值,讀取出來會是很離譜的數!
       有人說,可以這樣memset(arr,1,sizeof(arr));
       其實這樣做,就是將數組的所有值都填充為"0x01010101",也就是int數組的初始值變為了16843009
 !這確實有點出乎我們的預料!

  正確用法】
   方法一:可以用任何值來初始化char數組!比如 memset(arr,'a',10);
   方法二:可以用"0"來初始化任何類型數組!比如 memset(arr,0,sizeof(arr));//arr可以是char或int等類型數組!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM