void *memset(void *s, char ch,
size_t
n);函式解釋:將s中前n個位元組 (typedef unsigned int size_t)用 ch 替換並返回 s 。
memset:作用是在一段記憶體塊中填充某個給定的值,它是對較大的
結構體或
陣列進行清零操作的一種最快方法
[1]。第一: 搞反了 ch 和 n 的位置.
一定要記住如果要把乙個char a[20]清零,一定是 memset(a,0,20);
而不是 memset(a,20,0);
第二: 過度使用memset,我想這些
程式設計師可能有某種心理陰影,他們懼怕未經初始化的記憶體,所以他們會寫出這樣的**:
1
2
3
char
buffer[20];
memset
(buffer,0,
sizeof
(
char
)*20);
strcpy
(buffer,
"123"
);
這裡的memset是多餘的. 因為這塊
記憶體馬上就被覆蓋了,清零沒有意義.
第三: 其實這個錯誤嚴格來講不能算用錯memset,但是它經常在使用memset的場合出現
1
2
3
4
5
6
7
int
some_func(
struct
something *a)
這裡錯誤的
原因是vc函式傳參
過程中的
指標降級,導致sizeof(a),返回的是乙個 something*指標型別大小的的
位元組數,如果是32位,就是4位元組。
自己理解:
memset()的深刻內涵:用來對一段記憶體空間全部設定為某個字元,一般用在對定義的字串進行初始化為『 』或『/0』;例:char a[100];memset(a, '/0', sizeof(a));
memset與strcpy的區別:(1)
memcpy用來做記憶體拷貝,你可以拿它拷貝任何資料型別的物件,可以指定拷貝的資料長度;例:char a[100],b[50]; memcpy(b, a, sizeof(b));注 意如用sizeof(a),會造成b的記憶體位址溢位。(2)strcpy就只能拷貝字串了,它遇到'/0'就結束拷貝;例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字串長度(第乙個『/0』之前)是否超過50位,如超過,則會造成b的記憶體位址溢位。
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用法詳解
原型 extern void memset void buffer,int c,int count 用法 i nclude 功能 把buffer所指記憶體區域的前count個位元組設定成字元c。說明 返回指向buffer的指標。舉例 memset.c i nclude i nclude main m...