有關memset 函式

2021-09-27 09:53:31 字數 3234 閱讀 3623

一.函式介紹:

memset是計算機中c/c++語言函式。將s所指向的某一塊記憶體中的前n個 位元組的內容全部設定為ch指定的ascii值, 第乙個值為指定的記憶體位址,塊的大小由第三個引數指定,這個函式通常為新申請的記憶體做初始化工作, 其返回值為指向s的指標。原型:

void *memset(void *s,int ch,size_t n);標頭檔案:或

二.函式常見錯誤:

①:memset函式按位元組對記憶體塊進行初始化,所以不能用它將int陣列初始化為0和-1之外的其他值(除非該值高位元組和低位元組相同)。

②:memset(void *s, int ch,size_tn);中key實際範圍應該在0~~255,因為該函式只能取ch的後八位賦值給你所輸入的範圍的每個位元組,比如int a[5]賦值memset(a,-1,sizeof(int )*5)與memset(a,511,sizeof(int )*5) 所賦值的結果是一樣的都為-1;因為-1的二進位製碼為(11111111 11111111 11111111 11111111)而511的二進位製碼為(00000000 00000000 00000001 11111111)後八位都為(11111111),所以陣列中每個位元組,如a[0]含四個位元組都被賦值為(11111111),其結果為a[0](11111111 11111111 11111111 11111111),及a[0]=-1,因此無論ch多大只有後八位二進位制有效,而八位二進位制的範圍(0~255)ykq改。而對字元陣列操作時則取後八位賦值給字元陣列,其八位值作為ascii 碼。

三.函式說明:

把陣列中的元素值都設定成字元11

2

3

4

5

6

7

8

9

10

11

12

#include

#include

usingnamespacestd;

intmain()

而,如下程式想把陣列中的元素值設定成1,卻是不可行的1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

#include

#include

#include

usingnamespacestd;

intmain()

問題是:

第乙個程式為什麼可以,而第二個不行?

因為第乙個程式的

陣列a是字元型

的,字元型佔據記憶體大小是1byte,

而memset函式也是以位元組為單位進行賦值的

,所以你輸出沒有問題。而第二個程式

陣列a是整型的

,使用 memset還是

按位元組賦值

,這樣賦值完以後,每個陣列元素的值實際上

是0x01010101即十進位制的16843009

如果用memset(a,1,20),就是對a指向的記憶體的20個位元組進行賦值,每個都用數1去填充,轉為二進位制後,1就是00000001,佔乙個位元組。乙個int元素是4位元組,合一起是0000 0001,0000 0001,0000 0001,0000 0001,轉化成十六進製制就是0x01010101,就等於16843009,就完成了對乙個int元素的賦值。

四.與acm有關使用技巧:

設定無窮大inf:在程式設計中關於無窮大的設定,很多人可能設為0x7fffffff,這個數的確是32-bit int的最大值,符號位為0,其他的都是1,但在很多情況下,0x7fffffff會出現錯誤,比如溢位,這樣兩個無窮大數相加會變成負數,還有如在做dijkstra求最短路時,當做鬆弛操作,判斷if (d[u]+w[u][v]0x3f3f3f3f設為無窮大,0x3f3f3f3f的10進製表示為1061109567,這個數已達到10^9,足以表示無窮大,又0x3f3f3f3f+0x3f3f3f3f=2122219134,滿足無窮大+無窮大仍為無窮大當把無窮大設為0x3f3f3f3f時,在做初始化時也很方便,比如在初始化int型陣列a時,可以使用memset(a,0x3f,sizeof(a)),因為0x3f3f3f3f的每個位元組都是0x3f,如果使用0x7fffffff,需要迴圈賦值,耗費更多時間。

說明:如果我們想要將某個陣列清零,我們通常會使用memset(a,0,sizeof(a))這樣的**來實現(方便而高效),但是當我們想將某個陣列全部賦值為無窮大時(例如解決圖論問題時鄰接矩陣的初始化),就不能使用memset函式而得自己寫迴圈了(寫這些不重要的**真的很痛苦),我們知道這是因為memset是按位元組操作的,它能夠對陣列清零是因為0的每個位元組都是0,現在好了,如果我們將無窮大設為0x3f3f3f3f(即#define inf 0x3f3f3f3f),那麼奇蹟就發生了,0x3f3f3f3f的每個位元組都是0x3f!所以要把一段記憶體全部置為無窮大,我們只需要memset(a,0x3f,sizeof(a))。

所以在通常的場合下,0x3f3f3f3f真的是乙個非常棒的選擇。

**測試:

memset 函式用法

memset 原型 extern void memset void buffer,int c,int count 用法 include 功能 把buffer所指記憶體區域的前count個位元組設定成字元c。說明 返回指向buffer的指標。用來對一段記憶體空間全部設定為某個字元。舉例 char a ...

memset函式用法

樓主希望通過庫函式memset 來對乙個陣列進行初始化,需要了解一下該函式的工作原理。庫函式memset 是針對位元組操作的,其中第二個引數值被賦給第乙個引數指向的記憶體位址開始的每乙個位元組,因此,這種初始化其實存在侷限性,也導致其主要用於清除陣列內容等。比如 假設i 0,1,2,memset a...

memset函式用法

將s所指向的某一塊記憶體中的每個位元組的內容全部設定為ch指定的ascii值,塊的大小由第三個引數指定,這個函式通常為新申請的記憶體做初始化工作,其返回值為指向s的指標。在c中 or 在c 中 void memset void s,int ch,size t n 函式解釋 將s中前n個 位元組替換為...