memset函数的使用

来源:互联网 发布:js时间戳转换成时分秒 编辑:程序博客网 时间:2024/06/09 06:32

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

函数解释:将s中当前位置后面的n个字节(typedef unsigned int size_t)ch 替换并返回s

memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法,总的作用:将已开辟内存空间 s的首 n 个字节的值设为(非数值型字符) c

例如:

1char 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:***********

3int 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

4typedef struct

   {

char  className[30];

int  stu;

}ClassInfo;

ClassInfo info;

memset(&info,0,sizeof(ClassInfo));//清零

如果是Classinfo info[10]

memset(&info,0,10*sizeof(ClassInfo));//清零

5memset()函数常用于内存空间初始化。如:

char str[100];

memset(str,0,100);

6memset可以方便的清空一个结构类型的变量或数组。

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但是会拷贝字符串结束符