需要的標頭檔案
在c中
在c++中
void *memset(void *s,int ch,size_t n);
函式解釋:將s中後n個位元組(typedef unsigned int size_t)用ch替換並返回s.
函式作用:在一段記憶體塊中填充某個給定的值,它是對較大的結構體或陣列進行清零操作的一種最快的方法。
3.1.搞反了ch和n的位置:
一定要記住如果要把乙個char[20]清零,一定是memset(a,0,20),而不是memset(a,20,0)。
3.2過度使用memset:
我想這些程式設計師可能有某種心理陰影,他們懼怕未經初始化的記憶體,所以他們會寫這樣的**:
char buffer[20];
memset(buffer,0,sizeof(char)*20);
strcpy(buffer,"123");
這裡的memset是多餘的,因為這塊記憶體馬上就被覆蓋了,清零沒有意義。
3.3特別是對於字元型別的,剩餘的部分通常是不會為0的,不妨做乙個試驗,定義乙個字元陣列,並輸入一串字元,如果不用memset實現清零,使用messagebox顯示出來就會有亂碼(0表示null,如果有,就預設字元結束,不會輸出後面的亂碼)
比較下面兩個demo:
重點來了:
第乙個程式為什麼可以,而第二個不行?
1.因為第乙個程式的陣列a是字元型的,字元型佔據記憶體大小是1byte,而memset函式也是以位元組為單位進行賦值的,所以你輸出沒有問題。而第二個程式a是整型的,使用memset還是按位元組賦值,這樣賦完值以後,每個陣列元素的值實際上是ox01010101即十進位制的16843009。
2.如果用memset(a,1,20);(實際上與memset(a,1,5*sizeof(int))的結果是一樣的)
請看下面**:
就是對a指向的記憶體的20個位元組進行賦值,每個都是用ascii為1的字元去填充的,轉為二進位制後,1就是00000001,佔乙個位元組。乙個int元素是4位元組,合在一起就是00000001
00000001
00000001
00000001 ,就等於16843009,就完成了對乙個int元素的賦值了。
再來兩個例子加深理解:
#include#includeint main()
; int i;
printf("清零前:\n");
for(i=0;i<5;i++)
printf("\n");
memset(a,0,5*sizeof(int)); /*注意這裡與上面的程式不同*/
printf("清零後:\n");
printf("重新賦值前:\n");
for(i=0;i<5;i++)
printf("\n");
memset(a,1,5*sizeof(int)); /*注意這裡與上面的程式不同*/
printf("清零後:\n");
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個 位元組替換為...