void *memset(void *s, int ch, size_t n);
函数解释:将s中当前位置后面的n个字节(typedef unsigned int size_t)用 ch 替换并返回s。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法,总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值(非数值型字符) c。
例如:
1、 char a[20];
memset(a,0,20*sizeof(char));//char a[20]清零
2、 char buffer[]="Helloworld\n";
printf("Buffer before memset:%s\n",buffer);
memset(buffer,'*',strlen(buffer));
printf("Buffer after memset:%s\n",buffer);
输出结果:
Buffer before memset:Helloworld
Buffer after memset:***********
3、 int array[5]={1,4,3,5,2};
for(int i=0;i<5;i++)
cout<<array[i]<<"";
cout<<endl;
memset(array,0,5*sizeof(int));//如果用1代替0是不行的,因为用memset对非字符型数组赋初值是不可取的
for(int k=0;k<5;k++)
cout<<array[k]<<"";
cout<<endl;
输出的结果就是:
14352
00000
4、typedef struct
{
char className[30];
int stu;
}ClassInfo;
ClassInfo info;
memset(&info,0,sizeof(ClassInfo));//清零
如果是Classinfo info[10]
memset(&info,0,10*sizeof(ClassInfo));//清零
5、memset() 函数常用于内存空间初始化。如:
char str[100];
memset(str,0,100);
6、memset可以方便的清空一个结构类型的变量或数组。
struct sample_struct
{
char csName[16];
int iSeq;
int iType;
};
对于变量
struct sample_struct stTest;
一般情况下,清空stTest的方法:
stTest.csName[0]={'\0'};
stTest.iSeq=0;
stTest.iType=0;
用memset就非常方便:
memset(&stTest,0,sizeof(structsample_struct));
如果是数组:
structsample_struct TEST[10];
则
memset(TEST,0,sizeof(structsample_struct)*10);
另外:
如果结构体中有数组的话还是需要对数组单独进行初始化处理的。
注意:1、不要过度使用memset
例如
char buffer[4];
memset(buffer,0,sizeof(char)*4);
strcpy(buffer,"123");
//"123"中最后隐藏的'\0'占一位,总长4位。
这里的memset是多余的. 因为这块内存马上就被全部覆盖,清零没有意义.
2、以下情况并不多余,因某些编译器分配空间时,内存中默认值并不为0:
char buffer[20];
memset(buffer,0,sizeof(char)*20);
memcpy(buffer,"123",3);
//这一条的memset并不多余,memcpy并没把buffer全部覆盖,如果没有memset,
//用printf打印buffer会有乱码甚至会出现段错误。
//如果此处是strcpy(buffer,"123");便不用memset,
//strcpy虽然不会覆盖buffer但是会拷贝字符串结束符