memest
原型(please type "man memset" in your shell)
void
*memset(
void
*s,
intc, size_t n);
memset:
作用是在一段記憶體塊中填充某個給定的值,它對較大的結構體或陣列進行清零操作的一種最快方法。
常見的三種錯誤
第一
: 搞反了c 和
n的位置
.
一定要記住
如果要把乙個
char a[20]
清零,
一定是memset(a, 0, 20)
而不是memset(a, 20, 0)
第二
: 過度使用
memset,
我想這些程式設計師可能有某種心理陰影
, 他們懼怕未經初始化的記憶體
, 所以他們會寫出這樣的**
:
char
buffer[
20];
memset(buffer, 0,
sizeof
((char
)*20
));
strcpy(buffer,
"123"
);
這裡的memset
是多餘的
. 因為這塊記憶體馬上就被覆蓋了
, 清零沒有意義.
第三
: 其實這個錯誤嚴格來講不能算用錯
memset,
但是它經常在使用
memset
的場合出現
intsome_func(
struct
something *a)
問:為何要用
memset
置零?memset( &address, 0, sizeof(address))
;經常看到這樣的用法,其實不用的話,分配資料的時候,剩餘的空間也會置零的。
答
:1.如果不清空,可能會在測試當中出現野值。
你做下面的試驗看看結果
()
char
buf[5]
;cstring str,str1;//
memset(buf,0,
sizeof
(buf))
;for
(int
i = 0;
i<5;
i++)
trace(「%s/r/n「,str1)
2.
其實不然!特別是對於
字元指標型別的,剩餘的部分通常是不會為0的
,不妨作乙個試驗,定義乙個字元陣列,並輸入一串字元,如果不用
memset
實現清零,使用
messagebox
顯示出來就會有亂碼(0表示
null
,如果有,就預設字元結束,不會輸出後面的亂碼)
問
:
如下
demo
是可以的,能把陣列中的元素值都設定成字元
1,
#include
#include
using
namespace
std;
intmain()
而,如下程式想吧陣列中的元素值設定成
1,卻是不可行的
#include
#include
using
namespace
std;
intmain()
問題是:
1
,第乙個程式為什麼可以,而第二個不行,
2,不想要用
for,或是
while
迴圈來初始化
int a[5];
能做到嗎?(有沒有乙個像
memset
()這樣的函式初始化)
答
:
1.因為第乙個程式的陣列
a是字元型的,字元型佔據記憶體大小是
1byte
,而memset
函式也是以位元組為單位進行賦值的,所以你輸出沒有問題。而第二個程式
a是整型的,使用
memset
還是按位元組賦值,這樣賦值完以後,每個陣列元素的值實際上是
0x01010101
即十進位制的
16843009
。你看看你輸出結果是否這樣? 2.
如果用memset(a,1,20);
就是對a
指向的記憶體的
20個位元組進行賦值,每個都用
ascii為1
的字元去填充,轉為二進位制後,1就是
00000001,
佔乙個位元組。乙個
int元素是
4位元組,合一起就是
1000000010000000100000001
,就等於
16843009
,就完成了對乙個
int元素的賦值了。
memset用法詳解
原型 extern void memset void buffer,int c,int count 用法 i nclude 功能 把buffer所指記憶體區域的前count個位元組設定成字元c。說明 返回指向buffer的指標。舉例 memset.c i nclude i nclude main m...
memset用法詳解
1。void memset void s,int c,size t n 總的作用 將已開闢記憶體空間 s 的首 n 個位元組的值設為值 c。2。例子 include void main 3。memset 函式常用於記憶體空間初始化。如 char str 100 memset str,0,100 4。...
memset用法詳解
memest原型 pleasetype manmemset inyourshell void memset void s,intc,size tn memset 作用是在一段記憶體塊中填充某個給定的值,它對較大的結構體或陣列進行清零操作的一種最快方法。常見的三種錯誤 第一 搞反了c和n的位置.一定要...