memset()函数的应用

来源:互联网 发布:医院预约管理系统php 编辑:程序博客网 时间:2024/05/01 16:17

需要的头文件
<memory.h> or <string.h> memset

函数介绍

void *memset(void *s, int ch, size_t n);
函数解释:将s中前n个字节(typedef unsigned int size_t)用 ch 替换并返回 s 。ch表示的数字为指定的ASCⅡ值,
 搞反了 ch 和 n 的位置.
一定要记住如果要把一个char a[20]清零,一定是 memset(a,0,20);

memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法
1
2
3
4
5
6
7
intsome_func(structsomething*a)
{
memset(a,0,sizeof(a));
}
这里错误的原因是VC函数传参过程中的指针降级,导致sizeof(a),返回的是一个 something*指针类型大小的的字节数,如果是32位,就是4字节。
#include<iostream>#include<cstring>using namespace std;int main(){char a[5];char s[5];memset(a,49,5);//字符1的ascii码值为49 memset(s,'1',5);s[5]='\0';cout<<s<<endl;for(int i=0;i<5;i++)cout<<a[i]<<"";system("pause");return 0;}
输出 1 1 1 1 1
1 1 1 1 因为ch的数字表示指定的ASCⅡ值
#include<iostream>
#include<cstring>
#include<windows.h>
usingnamespacestd;
intmain()
{
inta[5];
memset(a,1,20);//如果这里改成memset(a,1,5*sizeof(int))也不可以,因为memset按字节赋值。
for(inti=0;i<5;i++)
cout<<a[i]<<"";
system("pause");
return0;
}
如果用memset(a,1,20);(实际上与memset(a,1,5*sizeof(int))结果是一样的)就是对a指向的内存的20个字节进行赋值,每个都用ASCⅡ为1的字符去填充,转为二进制后,1就是00000001,占一个字节。一个int元素是4字节,合一起就是0x01010101,就等于16843009,输出5个16843009就完成了对一个int元素的赋值了如果是memset(a,1,5);则输出1个
16843009,剩下的4个数是未知数,对a指向的内存的5个字节赋值。
也不一定就是把内容全部设置为ch指定的ASCⅡ值,而且该处的ch可为int或者其他类型,并不一定要是char类型。例如下面这样:
1
2
3
4
5
6
7
8
9
intarray[5]={1,4,3,5,2};
for(inti=0;i<5;i++)
cout<<array[i]<<"";
cout<<endl;
 
memset(array,0,5*sizeof(int));
for(intk=0;k<5;k++)
cout<<array[k]<<"";
cout<<endl;
输出的结果就是:
1
2
14352
00000
后面的表大小的参数是以字节为单位,所以,对于int或其他的就并不是都乘默认的1(字符型)了。而且不同的机器上int的大小也可能不同,所以最好用sizeof()。
所以上述程序如果改为
1
2
3
4
5
6
7
8
9
intarray[5]={1,4,3,5,2};
for(inti=0;i<5;i++)
cout<<array[i]<<"";
cout<<endl;
 
memset(array,1,5*sizeof(int));//注意这里与上面的程序不同
for(intk=0;k<5;k++)
cout<<array[k]<<"";
cout<<endl;
输出的结果就是:
1
2
14352
1684300916843009168430091684300916843009
为什么呢?
因为memset是以字节为单位就是对array指向的内存的4个字节进行赋值,每个都用ASCⅡ为1的字符去填充,转为二进制后,1就是00000001,占一个字节。一个int元素是4字节,合一起就是
1
00000001000000010000000100000001
就等于16843009,就完成了对一个int元素的赋值了。
所以用memset对非字符型数组赋初值是不可取的!
例如有一个结构体Some x,可以这样清零:
1
memset(&x,0,sizeof(Some));
如果是一个结构体的数组Some x[10],可以这样:
1
memset(x,0,sizeof(Some)*10);


0 0