memset是計(jì)算機(jī)中C/C++語(yǔ)言函數(shù)。
void **memset(void *s, int ch, size_t n);
函數(shù)解釋:將s中當(dāng)前位置后面的n個(gè)字節(jié) (typedef unsigned int size_t )用 ch 替換并返回 s 。
作用:在一段內(nèi)存塊中填充某個(gè)給定的值,它是對(duì)較大的結(jié)構(gòu)體或數(shù)組進(jìn)行清零操作的一種最快方法。
簡(jiǎn)單示例1:
如下demo是可以的,能把數(shù)組中的元素值都設(shè)置成字符1
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char a[5];
memset(a,'1',5);
for(int i=0;i<5;i++)
cout<<a[i]<<"";
system("pause");
return 0;
}
而,如下程序想把數(shù)組中的元素值設(shè)置成1,卻是不可行的
#include <iostream>
#include <cstring>
#include <windows.h>
using namespace std;
int main()
{
int a[5];
memset(a,1,20);
//也等價(jià)于memset(a,1,sizeof(a));.
for(int i=0;i<5;i++)
cout<<a[i]<<"";
system("pause");
return 0;
}
問(wèn)題是:
1.第一個(gè)程序?yàn)槭裁纯梢?,而第二個(gè)不行?
因?yàn)榈谝粋€(gè)程序的數(shù)組a是字符型的,字符型占據(jù)內(nèi)存大小是1Byte,而memset函數(shù)也是以字節(jié)為單位進(jìn)行賦值的,所以你輸出沒(méi)有問(wèn)題。而第二個(gè)程序a是整型的,使用 memset還是按字節(jié)賦值,這樣賦值完以后,每個(gè)數(shù)組元素的值實(shí)際上是0x01010101即十進(jìn)制的16843009。
如果用memset(a,1,20),就是對(duì)a指向的內(nèi)存的20個(gè)字節(jié)進(jìn)行賦值,每個(gè)都用數(shù)1去填充,轉(zhuǎn)為二進(jìn)制后,1就是00000001,占一個(gè)字節(jié)。一個(gè)int元素是4字節(jié),合一起是0000 0001,0000 0001,0000 0001,0000 0001,轉(zhuǎn)化成十六進(jìn)制就是0x01010101,就等于16843009,就完成了對(duì)一個(gè)int元素的賦值了。
簡(jiǎn)單示例2:
#include <string.h>
#include <stdio.h>
#include <memory.h>
int main(void)
{
char buffer[]="Helloworld\n";
printf("Buffer before memset:%s\n",buffer);
memset(buffer,'*',strlen(buffer));
printf("Buffer after memset:%s\n",buffer);
return 0;
}
輸出結(jié)果:
Buffer before memset:Helloworld
Buffer after memset:***********
(總結(jié)來(lái)源百度百科)