memset 函数是内存赋值函数,用来给某一块内存空间进行赋值的;包含在<string.h>头文件中,可以用它对一片内存空间逐字节进行初始化;
作用:将已开辟内存空间s的首n个字节的值设为值c。
注意: 该函数是按一个字节一个字节来给数组或者是结构体赋值。
原型为 :
void *memset(void *s, int v, size_t n);
s 可以是数组名,也可以是指向某一内在空间的指针;
v 为要填充的值;
n 为要填充的字节数;
非字符型数据
char str[20];
memset(str,'a',20);
如果是字符类型数组的话,memset可以随便用,但是对于其他类型的数组,一般只用来清0,如果是填充其他数据就会出错
int str[10];
memset(str,1,sizeof(str));//这样是错误的
因为memset是按照字节对待初始化空间进行初始化的,也就是说,函数的第二个参数值是按照一个一个字节往第一个参数所指区域赋值的,所以,对于单字节数据类型(char)可以初始化为任意支持的值;但是对于多字节数据类型只能初始化为0,而不能初始化成别的初值,因为对所有字节按任意顺序赋值0的结果都是0,而如果初始化为其他的值,就会一个字节一个字节的进行赋值,从而出现奇怪的结果。
如果像上面的示例中初始化为1,因为int一般是4个字节,所以会将每个字节都初始化为1,那么相当于将一个int元素初始化成了0000 0001 0000 0001 0000 0001 0000 0001,这样对于一个int元素是一个很大的数
含有指针类型的复杂数据
针对含有指针类型的复杂数据类型,谨慎使用memset,避免内存泄漏;
struct student{
char *name;
int score;
}stu;
当memset初始化时,并不会初始化name指向的char数组单元的值,而会把已经分配过内存的name指针本身设置为0,造成内存泄漏。同理,对std::vector等数据类型,也是不应该使用memset来初始化的。