memset使用方法及注意事项
一,memset(数组名,数据,sizeof(数组名)) 是将数组内存中的所有元素设置为特定的值;
以int为例
若第二参数为0,数组全部元素改为0;
若第二参数大于0,数组全部元素改为正无穷(可以暂且理解成无穷);
若第二参数为-1,数组全部元素改为-1;
若第二参数小于-1,数组全部元素改为负无穷。
二,memset(数组名,数据,字节总数) 或 memset(数组名,数据,n*sizeof(数据类型))
可以指定覆盖数组中前n个元素的值
字节数代表着覆盖n个字符的总字节数,
字节数必须是以下各类型所占字节数的整倍数
。
char 1个字节
bool 1个字节
int 4个字节
long long 8个字节
double 8个字节
另:sizeof()
作用就是返回一个对象或者类型所占的内存字节数。
如:
#include
<iostream>
#include
<cstring>
using
namespace
std
;
int
main
()
{
int
a
[
30
];
memset
(
a
,
0
,
sizeof
(
a
));
memset
(
a
,-
1
,
12
);
for
(
int
i
=
0
;
i
<=
25
;
i
++)
cout
<<
a
[
i
]<<
' '
;
return
0
;
}
输出的则是前三个为-1,后23个是0的数列;
memset(a,-1,12)还可以写成memset(a,-1,3*sizeof(int))。
sizeof后如果是类型必须加括号,如果是变量名可以不加括号,这是因为sizeof是个操作符而不是函数。
三,常见错误
1.搞反数据和字节总数的位置
2.过度使用memset
如:
#include
<cstdio>
#include
<cstring>
int
main
()
{
int
a
[
30
];
memset
(
a
,
0
,
80
);
for
(
int
i
=
0
;
i
<
20
;
i
++)
scanf
(
"%d"
,&
a
[
i
]);
for
(
int
i
=
0
;
i
<
20
;
i
++)
printf
(
"%d "
,
a
[
i
]);
return
0
;
}
这里的memset是多余的. 因为这块内存马上就被全部覆盖,清零没有意义.
值得注意的一点:
在使用字符数组时,sizeof(char数组名)返回的是整个数组所占字节总数,而strlen(char数组名)返回的则是字符数组中‘/0’之前的元素所占字节总数。
例如,
char
ch
[
20
]=
"0123456789"
;
int
a
=
sizeof
(
ch
),
b
=
strlen
(
ch
);
//结果a=20而b=10