平時使用memset
函式都是用來初始化字串,從來沒有注意過它具體是怎麼實現的,最近無意中發現原來這個函式裡面還是有坑的。
我嘗試用它來初始化整型陣列
int array[10]
;memset
(array,1,
sizeof
(a))
;
我原本是想將陣列元素全部初始化為1,可是卻是這樣的:
一開始不明白為什麼會這樣,查了以後才知道,void *memset(void *s, int ch, size_t n)
並不是直接把ch
的值賦到s
的元素上去。
我們先來看看這個神奇的數字:16843009 的二進位制表示形式是什麼:
16843009(10) =
0000
0001
0000
0001
0000
0001
0000
0001(2)
有沒有看出什麼規律?
也許你已經看出來了,為了更明顯一些,我們換個角度看:
0000
0001
//第 3 個位元組
0000
0001
//第 2 個位元組
0000
0001
//第 1 個位元組
0000
0001
//第 0 個位元組
原來memset
是以位元組為單位對每個元素賦值的
再來個例子:
memset
(array,23,
16);//此處只對 16 個位元組元素賦值(即4個整型)
//第 3 個位元組
0001
0111
//第 2 個位元組
0001
0111
//第 1 個位元組
0001
0111
//第 0 個位元組
因為字元型元素只占用乙個位元組,所以對字串用memset
初始化直接簡單的用ch
對每個元素賦值就行了
再來看乙個例子:
memset
(array,23,
10);//如果不足乙個完整的int型怎麼辦?
/* 10 % 4 == 2 第三個元素只有兩個位元組會被賦值 */
0000
0000
//第 3 個位元組
0000
0000
//第 2 個位元組
0001
0111
//第 1 個位元組
0001
0111
//第 0 個位元組
乙個memset函式的誤區
今天在對尤拉篩這個演算法練習的時候,發現了一直沒有對memset的初始化的誤區,在對乙個尤拉篩的板子的 找bug,卻一直找不出來。原始錯誤 include include int a 1000005 int prin 1000000 void prinme 素數打表 intmain printf d...
TableView 使用時的乙個異常
node是乙個結構體,anode作為node型別的指標,datalist是table的資料來源,資料新增方法如下 datalist addobject nsvalue value anode withobjctype encode struct node 下面是tableview部分 static ...
android Handler使用時乙個易犯的錯誤
最近在使用handler的時候發現乙個容易犯的錯誤,研究了一天才搞好。handler使用方法簡介 handler mhandler 1 定義handler,並實現handlermessage 方法,用來處理後台執行緒發過來的訊息。mhandler new handler 2 在後台執行緒 或者叫非u...