c语言 内存清除函数,C语言内存初始化函数MEMSET的用法

memset的功能是将内存块所指向的某一块内存中的每个字节的内容全部设置为指定的ASCII值,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作,其返回值为指向被初始化内存块的指针,它对较大的结构体或数组进行清零操作的一种最快方法。

函数原型:

void *memset(

void* dest,

int c,

size_t count

);

参数:

dest

Pointer to destination.

目的地址的指针

c

Character to set.

需要填充的字符

count

Number of characters.

填充字符的个数

需求环境:

操作系统:Windows CE 2.0 及其以上版本。

头文件:stdlib.h.

链接库:coredll.dll.

说明:

将dest所指向的某一块内存中的每个字节的内容全部设置为c指定的ASCII值,块的大小由第三个参数count指定,这个函数通常为新申请的内存做初始化工作,其返回值为指向dest的指针。

下面通过源码介绍memset的具体使用方法,本实例在VS2008+win7环境调试通过。

实例代码:

#include "stdafx.h"

#include

#include

#include

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;

}

结果:

6f2298e83113ca78c76b10a0477ea7dd.png

问题总结:

第一: 搞反了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

#include

#include

#include

int main(void)

{

//注意,该数组为int类型

int array[5] = {1,4,3,5,2};

for(int i = 0; i < 5; i++)

std::cout<

std::cout<<:endl>

//使用memset赋值

memset(array,1,5*sizeof(int));

for(int k = 0; k < 5; k++)

std::cout<

std::cout<<: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对非字符型数组赋初值是不可取的!

【发表评论0条 】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值