【起因】希望對各種型別的陣列進行初始化,避免野值
【函式標頭檔案】
#include
void *memset(void *s, int c, size_t n);
【使用說明】the memset() function fills the first nbytesof the memory area pointed to by s with the constantbytec.
【錯誤用法】
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等型別陣列!
不難看出為什麼memset在"string.h"標頭檔案中宣告了,因為他是以byte為單位來處理的,而char正好是乙個byte!
用"0"來初始化陣列時,要初始化的長度最好用sizeof(arr)來計算,這樣避免出錯!是不是很強大?
當然,並非任何時候都需要初始化!詳情請參考
linux中memset的正確用法
起因 希望對各種型別的陣列進行初始化,避免野值 函式標頭檔案 include void memset void s,int c,size t n 使用說明 the memset function fills the first nbytesof the memory area pointed to ...
linux中memset的正確用法
include the memset function fills the first n bytes of the memory area pointed to by s with the constant byte c.即對各種型別的陣列進行初始化,避免野值,注意是按位元組填充 void mem...
memset 的正確用法
memset 位於標頭檔案string.h中,用法是將乙個位元組乙個位元組的設定為某個數.例如 memset a,0,sizeof a a為陣列,就是將a中的每乙個位元組都賦值為0。以前沒有正確理解memset 的用法,將陣列賦值為1時,用memset a,1,sizeof a 導致出現很怪的數字。...