起因】希望對各種型別的陣列進行初始化,避免野值
memset函式將s所指向的某一塊記憶體中的每個位元組的內容全部設定為ch指定的ascii值, 塊的大小由第三個引數指定,這個函式通常為新申請的記憶體做初始化工作, 其返回值為指向s的指標。
【函式標頭檔案】
#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)來計算,這樣避免出錯!是不是很強大?
當然,並非任何時候都需要初始化!詳情請參考
#include
#include
#include
int main(void)
輸出結果:
buffer before memset: hello world
buffer after memset: ***********
編譯平台: microsoft visual c++ 6.0
也不一定就是把內容全部設定為ch指定的ascii值,而且該處的ch可為int或者其他型別,並不一定要是char型別。
例如下面這樣:
int array[5] = ;
for(int i = 0; i < 5; i++)
coutfor(int k = 0; k < 5; k++)
cout輸出的結果就是:
1 4 3 5 2
0 0 0 0 0
後面的表大小的引數是以位元組為單位,所以,對於int或其他的就並不是都乘預設的1(字元型)了。而且不同的機器上int的大小也可能不同,所以最好用sizeof()。
要注意的是,memset是對位元組進行操作, 所以上述程式如果改為 :
int array[5] = ;
for(int i = 0; i < 5; i++)
cout// 注意 這裡與上面的程式不同
for(int k = 0; k < 5; k++)
cout輸出的結果就是:
1 4 3 5 2
16843009 16843009 16843009 16843009 16843009
為什麼呢 因為memset是以位元組為單位就是對array指向的記憶體的5個位元組進行賦值,每個都用 ascii為1的字元去填充,轉為二進位制後,1就是00000001,佔乙個位元組。乙個int元素是4位元組,合一起就是 00000001000000010000000100000001,就等於16843009,就完成了對乙個int元素的賦值了。
memset函式的性質
將s所指向的某一塊記憶體中的每個 位元組的內容全部設定為ch指定的ascii值,塊的大小由第三個引數指定,這個函式通常為新申請的記憶體做初始化工作,其返回值為指向s的指標。目錄需要的標頭檔案 函式原型 函式介紹 常見錯誤 常見問題 程式例 memset函式詳細說明 需要的標頭檔案 函式原型 函式介紹...
memset 函式的使用
語言 c c 標頭檔案 或 函式原型 void memset void ptr,int value,size t num 注 ptr 指向要填充的記憶體塊的指標。value 要設定的值。該值作為int傳遞,但該函式使用該值的unsigned char轉換填充記憶體塊。num 要設定為值的位元組數。解...
memset函式的使用
void memset void s,int ch,size t n 函式解釋 將s中當前位置後面的 n個位元組 typedef unsigned int size t 用 ch 替換並返回s。memset 作用是在一段記憶體塊中填充某個給定的值,它是對較大的結構體或陣列進行清零操作的一種最快方法 ...