首先按照惯例看看来自MSDN对参数的解释:
最头疼的是第三个参数不知道该赋值多少?记住通用的解法:
如果目标地址是 int 数组的指针ptr,则第三个参数应写成(sizeof(int)*数组的元素个数);
如:int *a=new int[n];
memset(a,0,sizeof(int)*n);
bool *b=new int[n];
memset(b,false,sizeof(bool)*n);
sizeof()返回的是其参数所占的byte(字节)数,如sizeof(int)为4,sizeof(bool)为1;
比如上面的例子:
int *a=new int[n];
memset(a,0,sizeof(int)*n);
memset对指针a所指向的空间以byte为单位,即对每个byte进行赋值为0,而第三个参数给出的是总的字节(byte)数,所以总共赋了sizeof(int)*n个0,每个byte赋值一个0。
倘若使用memset(a,1,sizeof(int)*n),期望让a所指向的数组中的每个元素赋值为1,那就错了,memset会从a所指向的地址的低位(即从右向左)开始,每一个byte就赋值为1,总共赋值了sizeof(int)*n个byte,所以计算一下a所指向的数组中的每个元素的值为16843009,即二进制为:00000001 00000001 00000001 00000001;
这可以通过下面的代码来分析:
int *a=new int[5];
cout<<sizeof(a)<<endl<<sizeof(bool)<<endl;
memset(a,0,sizeof(int)*5);
for(int i=0;i!=5;++i)
cout<<a[i]<<" ";
cout<<endl;
memset(a,1,5);
for(int i=0;i!=5;++i)
cout<<a[i]<<" ";
cout<<endl;
这就是memset,所以使用时要小心,用它来赋0值还是很实用的,以及用它来赋值字符(char)也很好用,但是要牢记它是以byte为单位进行赋值的。