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