memset函數詳解


首先要知道memset函數是對字節為單位進行賦值的;

 

void *memset(void *s, int ch,  size_t n);

 

函數解釋:將s中前n個字節 (typedef unsigned int size_t )用 ch 替換並返回 s 。
其實這里面的ch就是ascii為ch的字符;
將s所指向的某一塊內存中的前n個 字節的內容全部設置為ch指定的ASCII
/*************************************************************************************************************/

 

memset:作用是在一段內存塊中填充某個給定的值,它是對較大的 結構體數組進行清零操作的一種最快方法[1] 

如果用memset(a,1,20);(實際上與memset(a,1,5*sizeof(int))結果是一樣的)就是對a指向的內存的20個字節進行賦值,每個都用ASCⅡ為1的字符去填充,轉為二進制后,1就是00000001,占一個字節。一個INT元素是4字節,合一起是0000 0001,0000 0001,0000 0001,0000 0001,轉化成十六進制就是0x01010101,就等於16843009,就完成了對一個INT元素的賦值了。

 

/****************************************************************************************************************/
清零是memset(a,0,sizeof(a));
初始化為無窮大為memset(a,0x3f,sizeof(0x3f));
下面談談無窮大的用法;

0x3f3f3f3f的十進制是1061109567,也就是10^9級別的(和0x7fffffff一個數量級),而一般場合下的數據都是小於10^9的,所以它可以作為無窮大使用而不致出現數據大於無窮大的情形。

另一方面,由於一般的數據都不會大於10^9,所以當我們把無窮大加上一個數據時,它並不會溢出(這就滿足了“無窮大加一個有窮的數依然是無窮大”),事實上0x3f3f3f3f+0x3f3f3f3f=2122219134,這非常大但卻沒有超過32-bit int的表示范圍,所以0x3f3f3f3f還滿足了我們“無窮大加無窮大還是無窮大”的需求。

最后,0x3f3f3f3f還能給我們帶來一個意想不到的額外好處:如果我們想要將某個數組清零,我們通常會使用memset(a,0,sizeof(a))這樣的代碼來實現(方便而高效),但是當我們想將某個數組全部賦值為無窮大時(例如解決圖論問題時鄰接矩陣的初始化),就不能使用memset函數而得自己寫循環了(寫這些不重要的代碼真的很痛苦),我們知道這是因為memset是按字節操作的,它能夠對數組清零是因為0的每個字節都是0,現在好了,如果我們將無窮大設為0x3f3f3f3f,那么奇跡就發生了,0x3f3f3f3f的每個字節都是0x3f!所以要把一段內存全部置為無窮大,我們只需要memset(a,0x3f,sizeof(a))。

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

因為char是1字節,memset是按照字節賦值的,相當於把每個字節都設為那個數,所以char型的數組可賦任意值,int是4個字節,當memset(,1,sizeof()); 1相當於ASSCII碼的1,1轉為二進制00000001,當做一字節,一字節8位,int為4字節,所以初始化完每個數為00000001000000010000000100000001 = 16843009;

初始化最大值的方法:

如果你想初始最大化,第一位為符號位,不能為1,剩下全是1,也就是7個1,1111111化為

十六進制正好為0x7f,所以memset(,0x7f,sizeof());就可以了

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM