memset 函式及其作用

2021-10-09 20:10:26 字數 3560 閱讀 4196

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

函式解釋:將s中前n個位元組替換為ch並返回s;

memset:作用是在一段記憶體塊中填充某個給定的值,它是對較大的結構體或陣列進行清零操作的一種最快方法。

函式作用

1,memset() 函式常用於記憶體空間初始化。

2,memset()的深刻內涵:用來對一段記憶體空間全部設定為某個字元,一般用在對定義的字串進行初始化

例如:memset(a,』\0』,sizeof(a));

3,memset可以方便的清空乙個結構型別的變數或陣列。

memset()函式原型是extern void *memset(void *buffer, int c, int count) buffer:為指標或是陣列,

c:是賦給buffer的值,

count:是buffer的長度.

這個函式在socket中多用於清空陣列.如:原型是memset(buffer, 0, sizeof(buffer))

memset 用來對一段記憶體空間全部設定為某個字元,一般用在對定義的字串進行初始化為『 』或『/0』;

例:char a[100];memset(a, 『/0』, sizeof(a));

memset可以方便的清空乙個結構型別的變數或陣列。

如:struct sample_struct

;對於變數:

struct sample_strcut sttest;

一般情況下,清空sttest的方法:

sttest.csname[0]=』/0』;

sttest.iseq=0;

sttest.itype=0;

用memset就非常方便:

memset(&sttest,0,sizeof(struct sample_struct));

如果是陣列:

struct sample_struct test[10];

則memset(test,0,sizeof(struct sample_struct)*10);

2.提問:「將s所指向的某一塊記憶體中的每個位元組的內容全部設定為ch指定的ascii值,塊的大小由第三個引數指定,這個函式通常為新申請的記憶體做初始化工作。用 法: void *memset(void *s, char ch, unsigned n);」

//「將s所指向的某一塊記憶體中的每個位元組的內容全部設定為ch指定的ascii值」幹什麼?為什麼說「這個函式通常為新申請的記憶體做初始化工作。」?

答:剛分配的記憶體空間,或者是被你用過的記憶體空間裡面的資料是不固定的為了避免這些無用的資料給自己的程式帶來影響,可以用memset把這些記憶體裡面的資料置成某個數值一般情況下是置0,當然,如果你的程式不會受這些無用資料影響,就不用做這個工作了所謂「初始化」,當然是指將你定義的變數或申請的空間賦予你所期望的值,例如語句int i=0;就表明定義了乙個變數i,並初始化為0;如果int j=5;就表明定義了乙個變數j,並初始化為5。

但是對於大塊兒記憶體的分配,這種方法當然不行,例如int arr[100];定義了陣列arr,包含100個元素,如果你寫成int arr[100]=0;想將陣列全部內容初始化為0,是不行的,連編譯都不能通過。這種情況的初始化,有兩種方法,一種是乙個乙個的初始化,如for(int i=0;i<100;i++)arr[i]=0;就完成了陣列的初始化。另一種方法,就是使用memset:乙個語句就夠了--memset(arr,0,sizeof(int)*100);
當然,如果用malloc分配的記憶體,一般只能使用memset來初始化了,用第一種初始化方法明顯不合適。

例:char ch[10]

比如memset(ch,0,8),就是把陣列ch前八項置為零,後面的不一定為零。比如剛開始ch[1]='z',ch[8]='a',ch[9]='b',經過memset後,ch[1]為零了,而ch[8],ch[9]都不變.

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()的深刻內涵:用來對一段記憶體空間全部設定為某個字元,一般用在對定義的字串進行初始化為『 』或『/0』;例:char a[100];memset(a, 『/0』, sizeof(a));

memcpy用來做記憶體拷貝,你可以拿它拷貝任何資料型別的物件,可以指定拷貝的資料長度;例:char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a),會造成b的記憶體位址溢位。

strcpy就只能拷貝字串了,它遇到』/0』就結束拷貝;例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字串長度(第乙個『/0』之前)是否超過50位,如超過,則會造成b的記憶體位址溢位。

問:為何要用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;

int main()

{char a[5];

memset(a,『1』,5);

for(int i = 0;i < 5;i++)

cout<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函式及其用法

每種型別的變數都有各自的初始化方法,memset 函式可以說是初始化記憶體的 萬能函式 通常為新申請的記憶體進行初始化工作。它是直接操作記憶體空間,mem即 記憶體 memory 的意思。該函式的原型為 include void memset void s,int c,unsigned long n...

C 虛函式及其作用

虛函式的作用 虛函式的作用主要是為了能夠實現多型而設計的。可以讓成員函式操作一般化,用基類的指標指向不同的派生類的物件時,基類指標呼叫其虛成員函式,則會呼叫其真正指向物件的成員函式,而不是基類中定義的成員函式 只要派生類改寫了該成員函式 若不是虛函式,則不管基類指標指向的哪個派生類物件,呼叫時都 會...

memset用法 作用 常見錯誤

void memset void s,char ch,size t n 函式解釋 將s中前n個位元組 typedef unsigned int size t 用 ch 替換並返回 s memset 作用是在一段記憶體塊中填充某個給定的值,它是對較大的 結構體或 陣列進行清零操作的一種最快方法 1 第...