需要的头文件
<memory.h> or <string.h> memset
函数介绍
void *memset(void *s, int ch,
size_t n);
搞反了 ch 和 n 的位置.
一定要记住如果要把一个char a[20]清零,一定是 memset(a,0,20);
1
2
3
4
5
6
7
|
intsome_func(structsomething*a)
{
…
…
memset
(a,0,
sizeof
(a));
…
}
|
#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,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));
|
1
|
memset
(x,0,
sizeof
(Some)*10);
|