2011-01-16 20:09:14|?次阅读|上传:wustguangh【已有?条评论】发表评论
memset的功能是将内存块所指向的某一块内存中的每个字节的内容全部设置为指定的ASCII值,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作,其返回值为指向被初始化内存块的指针,它对较大的结构体或数组进行清零操作的一种最快方法。
void *memset( void* dest, int c, size_t count );
操作系统: Windows CE 2.0 及其以上版本。
头文件: stdlib.h.
链接库: coredll.dll.
将dest所指向的某一块内存中的每个字节的内容全部设置为c指定的ASCII值,块的大小由第三个参数count指定,这个函数通常为新申请的内存做初始化工作,其返回值为指向dest的指针。
下面通过源码介绍memset的具体使用方法,本实例在VS2008+win7环境调试通过。
实例代码:
#include "stdafx.h" #include <string.h> #include <stdio.h> #include <memory.h> int main(void) { char buffer[] = "Hello world "; printf("Buffer before memset: %s ", buffer); memset(buffer, '*', strlen(buffer) ); printf("Buffer after memset: %s ", buffer); getchar(); return 0; }
结果:
第一: 搞反了c 和 n的位置。
一定要记住 如果要把一个char a[20]清零, 一定是 memset(a, 0, 20),而不是 memset(a, 20, 0)
第二: 过度使用memset。
我想这些程序员可能有某种心理阴影, 他们惧怕未经初始化的内存, 所以他们会写出这样的代码:
char buffer[20]; memset(buffer, 0, sizeof((char)*20)); strcpy(buffer, "123");
这里的memset是多余的. 因为这块内存马上就被覆盖了, 清零没有意义.
第三: 注意要设置字符的个数。
其实这个错误经常体现在使用sizeof函数来获取变量占用的内存空间,严格来讲不能算用错memset, 但是它经常在使用memset的场合出现
int some_func(struct something *a){ //… //… memset(a, 0, sizeof(a)); //… }
在该程序中,sizeof(a)返回的是指针类型的长度,显然不是我们需要的结果,正确的方法应该是sizeof(struct something)。
第四: memset进行的是字符操作。
请分析以下代码
#include "stdafx.h" #include <string.h> #include <stdio.h> #include <memory.h> #include <iostream> int main(void) { //注意,该数组为int类型 int array[5] = {1,4,3,5,2}; for(int i = 0; i < 5; i++) std::cout<<array[i]<<" "; std::cout<<std::endl; //使用memset赋值 memset(array,1,5*sizeof(int)); for(int k = 0; k < 5; k++) std::cout<<array[k]<<" "; std::cout<<std::endl; getchar(); }
该程序的输出结果是:
1 4 3 5 2
16843009 16843009 16843009 16843009 16843009
为什么呢?
因为memset是以字节为单位就是对array指向的内存的5个字节进行赋值,每个都用ASCII为1的字符去填充,转为二进制后,1就是 00000001,占一个字节。一个INT元素是4字节,合一起就是00000001000000010000000100000001,就等于 16843009,就完成了对一个INT元素的赋值了。所以用memset对非字符型数组赋初值是不可取的!