競賽中經常使用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 函式可以說是初始化記憶體的 萬能函式 通常為新申請的記憶體進行初始化工作。它...