memset函數

常見錯誤:
第一: 搞反了 ch 和 n 的位置.
必定要記住若是要把一個char a[20]清零,必定是 memset(a,0,20);而不是 memset(a,20,0);
第二: 過分使用memset,我想這些 程序員可能有某種心理陰影,他們害怕未經 初始化的內存,因此他們會寫出這樣的代碼:
這裏的 memset是多餘的. 由於這塊內存立刻就被所有覆蓋,清零沒有意義.
另:如下狀況並很少餘,因某些 編譯器分配空間時,內存中默認值並不爲0:
第三: 其實這個錯誤嚴格來說不能算用錯memset,可是它常常在使用memset的場合出現
 
 
這裏錯誤的 緣由是VC函數傳參 過程中的 指針降級,致使 sizeof(a),返回的是一個 something*指針類型大小的的 字節數,若是是32位,就是4字節。
 
常見問題:
問:爲什麼要用memset置零?memset(&Address,0,sizeof(Address));常常看到這樣的用法,其實不用的話,分配數據的時候,剩餘的空間也會置零的。
答:1.若是不清空,可能會在測試當中出現野值。你作下面的試驗看看結果()
 
 
這樣寫,有沒有memset,輸出都是同樣
⒉其實否則!特別是對於字符指針類型的,剩餘的部分一般是不會爲0的,不妨做一個 試驗,定義一個字符數組,並輸入一串字符,若是不用memset實現清零,使用MessageBox顯示出來就會有亂碼(0表示NULL,若是有,就默認字符結束,不會輸出後面的亂碼)
問:
以下demo是能夠的,能把 數組中的 元素值都設置成字符1,
 
而,以下程序想把數組中的元素值設置成1,倒是不可行的
 
問題是:
1,第一個程序爲何能夠,而第二個不行?
由於第一個程序的數組a是 字符型的,字符型佔據內存大小是1Byte,而memset函數也是以 字節爲單位進行賦值的,因此你輸出沒有問題。而第二個程序a是整型的,使用memset仍是按字節賦值,這樣賦值完之後,每一個數組元素的值其實是0x01010101即十進制的16843009。
2,不想要用for,或是while循環來初始化int a[5];能作到嗎?(有沒有一個像memset()這樣的函數初始化)
若是用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元素的賦值了。
 
程序範例:
 
輸出結果:
 
也不必定就是把內容所有設置爲ch指定的ASCⅡ值,並且該處的ch可爲int或者其餘類型,並不必定要是char類型。例以下面這樣:
 
 
輸出的結果就是:
後面的表大小的參數是以 字節爲單位,因此,對於int或其餘的就並非都乘默認的1(字符型)了。並且不一樣的機器上int的大小也可能不一樣,因此最好用sizeof()。
要注意的是,memset是對 字節進行操做,因此上述程序若是改成
 
 
輸出的結果就是:
 
爲何呢?
由於memset是以 字節爲單位就是對array指向的內存的4個字節進行賦值, 字節,合一塊兒就是
 
就等於16843009,就完成了對一個INT元素的賦值了。因此用memset對非字符型 數組賦初值是不可取的!
例若有一個 結構體Some x,能夠這樣清零:
若是是一個 結構體數組Some x[10],能夠這樣:
memset函數詳細說明
1。void *memset(void *s,int c, size_tn)
總的做用:將已開闢內存空間 s 的首 n 個 字節的值設爲值 c。
2。例子
 
【以上例子出現內存訪問衝突應該是由於s被當作 常量放入程序 存儲空間,若是修改成 char s[]="Golden Global View";則沒有問題了。】
【應該是沒有問題的,字符串 指針同樣能夠,並非只讀內存,能夠正常運行】
【此實例能夠正常編譯運行,並不像樓主說的須要char s[]】
【memset(s,'G',6)這樣是存在內存訪問衝突的,由於s爲常量字符串,不能修改的】
3。memset() 函數經常使用於內存空間初始化。如:
4。memset()的深入內涵:用來對一段內存空間所有設置爲某個字符,通常用在對定義的字符串進行初始化爲‘memset(a,'\0',sizeof(a));
5。補充:一點技巧
memset能夠方便的清空一個結構類型的 變量數組
如:
對於變量
通常狀況下,清空stTest的方法:
用memset就很是方便:
若是是數組:
另外:
若是 結構體中有 數組的話仍是須要對數組單獨進行初始化處理的。
相關文章
相關標籤/搜索