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,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
- memset()函数的应用
- 关于memset()函数的一点解读
- c/c++的memset()函数
- memset函数的用法
- memset函数的用法
- C++的memset函数
- memset函数的性质
- memset函数的用法
- memset函数的使用
- C++的memset函数
- memset函数的使用
- C++的memset函数
- memset 函数的注意事项
- memset函数的用法
- memset函数的用法
- memset函数的用法
- memset函数的作用
- 函数memset的实现
- UVa live3415Guardian of Decency(二分最大匹配之最大独立点集)
- Java8新特性——可重复注解
- Android常见的错误及解决
- 2862--勾股定理
- java实现Img与PDF相互转换
- memset()函数的应用
- A*算法(转)
- SWF 文件不能访问本地资源
- 利用Robot Framework和Python wrapper of Android uiautomator的Android测试自动化
- Windows应用程序高级控件之ImageList
- 算法导论堆排序java实现
- VS2010 无法打开包括文件:“iostream.h”: No such file or directory
- 清除浮动
- FIREFOX和CHROME浏览器下PercentLoaded()不能使用的解决方案