【起因】希望對各種類型的數組進行初始化,避免野值
【函數頭文件】
提示:在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等類型數組!