乙個memset函式使用時的坑

2021-07-29 22:34:21 字數 1772 閱讀 5004

平時使用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...