linux下的memset函式

2021-06-21 16:37:25 字數 2730 閱讀 5362

起因】希望對各種型別的陣列進行初始化,避免野值

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 作用是在一段記憶體塊中填充某個給定的值,它是對較大的結構體或陣列進行清零操作的一種最快方法 ...