memset函式的使用原理

2021-07-26 12:26:01 字數 984 閱讀 4796

競賽中經常使用memset函式進行陣列初始化,但只能初始為0, -1。哪怕寫成:

int num[n];

memset(num, 1, sizeof(num));

num[0]也是個很大的數。

今天看了一下c標準庫裡面memset函式的原始碼,一切就清楚了

void *(memset)(void *s, int c, size_t n)

可以看出這個函式本身就是為字元陣列設計的。

原始碼說明對於陣列引數是按照字元陣列的形式進行賦值的。

也就是c的值每次賦值給乙個位元組,而不是4個位元組,c的型別是int型別,4個位元組,

但只會賦值最低位的乙個位元組的內容。

當c是1的時候,二進位制低8位就是0000001

最終int型別陣列乙個元素的內容就變成了 0000001

0000001

0000001

0000001

明顯是個很大的數。

那0跟-1為什麼可以呢?

因為0的二進位制表示全都是0,-1的二進位制表示全都是1,

全0填充32位,int型別也是0

全1填充32位,int型別也是-1

知道了這個內部原理就可以利用一下了,

#define inf 0x3f3f3f3f

int num[n];

memset(num, inf, sizeof(num));

這樣得到的陣列裡面的每乙個元素數值都是inf

看一下inf的二進位制表示:

00111111001111110011111100111111

可以看出低8位是00111111,也就是實際賦值時是用

00111111來填充乙個int型別,結果正好也是

00111111001111110011111100111111

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

memset( 函式的使用

在前面不止一次說過,定義變數時一定要進行初始化,尤其是陣列和結構體這種占用記憶體大的資料結構。在使用陣列的時候經常因為沒有初始化而產生 燙燙燙燙燙燙 這樣的野值,俗稱 亂碼 每種型別的變數都有各自的初始化方法,memset 函式可以說是初始化記憶體的 萬能函式 通常為新申請的記憶體進行初始化工作。它...