linux中memset的正確用法

2021-07-11 11:02:50 字數 1633 閱讀 9258

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

【函式標頭檔案】

#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 導致出現很怪的數字。...