memset() 函数详解(标记备忘)
来源:互联网 发布:通达数据库管理软件 编辑:程序博客网 时间:2024/05/16 03:37
#include <string.h>
void *memset( void *buffer, int ch, size_t count );
功能: 函数拷贝ch 到buffer 从头开始的count 个字符里, 并返回buffer指针。 memset() 可以应用在将一段内存初始化为某个值。例如:
memset( the_array, '/0', sizeof(the_array) );
这是将一个数组的所以分量设置成零的很便捷的方法。
简单示例:
也不一定就是把内容全部设置为ch指定的ASCII值,而且该处的ch可为int或者其他类型,并不一定要是char类型。例如下面这样:
int array[5] = {1,4,3,5,2};
for(int i = 0; i < 5; i++)
cout<<array[i]<<" ";
cout<<endl;
memset(array,0,5*sizeof(int));
for(int k = 0; k < 5; k++)
cout<<array[k]<<" ";
cout<<endl;
输出的结果就是:
1 4 3 5 2
0 0 0 0 0
后面的表大小的参数是以字节为单位,所以,对于int或其他的就并不是都乘默认的1(字符型)了。而且不同的机器上int的大小也可能不同,所以最好用sizeof()。
要注意的是,memset是对字节进行操作!
所以上述程序如果改为
int array[5] = {1,4,3,5,2};
for(int i = 0; i < 5; i++)
cout<<array[i]<<" ";
cout<<endl;
memset(array,1,5*sizeof(int));// 注意 这里与上面的程序不同
for(int k = 0; k < 5; k++)
cout<<array[k]<<" ";
cout<<endl;
输出的结果就是:
1 4 3 5 2
16843009 16843009 16843009 16843009 16843009
为什么呢?
因为memset是以字节为单位就是对array指向的内存的4个字节进行赋值,每个都用ASCII为1的字符去填充,转为二进制后,1就是00000001,占一个字节。一个INT元素是4字节,合一起就是00000001000000010000000100000001,就等于16843009,就完成了对一个INT元素的赋值了。
所以用memset对非字符型数组赋初值是不可取的!
例如有一个结构体Some x,可以这样清零:
memset( &x, 0, sizeof(Some) );
如果是一个结构体的数组Some x[10],可以这样:
memset( x, 0, sizeof(Some)*10 );
以下是看lemur中TermCache时遇到memset(_cacheTerm,0xff,sizeof(_cacheTerm))内存初始化后,HashTable中termid初始为-1原因,测试如下(未给出HashTable,只是测试结构体caheTerm[CACHE_SIZE]的初始化:
- memset() 函数详解(标记备忘)
- hdu 4509(memset标记)
- memset函数详解
- memset函数详解
- memset函数详解
- memset函数详解说明
- memset 函数详解
- memset函数使用详解
- memset函数使用详解
- Memset 函数详解
- memset函数使用详解
- memset函数使用详解
- memset函数使用详解
- memset函数使用详解
- memset()函数 详解
- Memset 函数详解
- memset()函数详解
- memset函数使用详解
- OpenCV 的 canny掃描實驗
- 填充窗口颜色
- 贝叶斯定理及典型应用
- WMI错误
- 项目经理知道该何时全身而退
- memset() 函数详解(标记备忘)
- 在jsp中使用JDBC来连接MySQL数据库
- 没啥大用,但还是记录一下:让FF支持outerHTML
- VC调用其他程序以及用其他程序打开相应文件
- MSSQL 以块删除表数据(大表删除)
- 赛门铁克 Veritas Storage Foundatio
- 一些觉得比较好的博客
- flex中自定义网格组件
- TIBCO ESB实战系列:TIBCO数据库适配器双向数据同步解决方案