C++ memset 浅析

【memset 原型】

void *memset(void *s,  int c, size_t n);

【memset 作用】

memset:作用是在一段内存块中填充某个给定的值,它对较大的结构体或数组进行清零操作的一种最快方法。

【注意事项】

常见的三种错误

第一: 搞反了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是多余的. 因为这块内存马上就被覆盖了, 清零没有意义.

第三: 其实这个错误严格来讲不能算用错memset, 但是它经常在使用memset的场合出现

int some_func(struct something *a){

memset(a, 0, sizeof(a));

}

问:

为何要用memset置零?memset( &Address, 0, sizeof(Address));经常看到这样的

用法,其实不用的话,分配数据的时候,剩余的空间也会置零的。

答:

1.如果不清空,可能会在测试当中出现野值。 你做下面的试验看看结果()

char buf[5];

CString str,str1; //memset(buf,0,sizeof(buf)); for(int i = 0;i<5;

i++) { str.Format(“%d “,buf[i]); str1 +=str ; } TRACE(“%s\r\n“,st

r1)

2.其实不然!特别是对于字符指针类型的,剩余的部分通常是不会为0的,不妨作一个试验,

定义一个字符数组,并输入一串字符,如果不用memset实现清零,使用MessageBox显示出

来就会有乱码(0表示NULL,如果有,就默认字符结束,不会输出后面的乱码)

问:

如下demo是可以的,能把数组中的元素值都设置成字符1,

#include <iostream>

#include <cstring>

using namespace std;

int main()

{

char a[5];

memset(a,‘1‘,5);

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

cout<<a[i]<<"  ";

system("pause");

return 0;

}

而,如下程序想吧数组中的元素值设置成1,却是不可行的

#include <iostream>

#include <cstring>

using namespace std;

int main()

{

int a[5];

memset(a,1,5);//这里改成memset(a,1,5 *sizeof(int))也是不可以的

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

cout<<a[i]<<"  ";

system("pause");

return 0;

}

问题是:

1,第一个程序为什么可以,而第二个不行,

2,不想要用for,或是while循环来初始化int a[5];能做到吗?(有没有一个像memset

()这样的函数初始化)

答:

1.因为第一个程序的数组a是字符型的,字符型占据内存大小是1Byte,而memset函数也

是以字节为单位进行赋值的,所以你输出没有问题。而第二个程序a是整型的,使用memset

还是按字节赋值,这样赋值完以后,每个数组元素的值实际上是0x01010101即十进制的

16843009。你看看你输出结果是否这样?

2.如果用memset(a,1,20);

就是对a指向的内存的20个字节进行赋值,每个都用ASCII为1的字符去填充,转为二进

制后,1 就是00000001,占一个字节。一个INT 元素是4 字节,合一起就是

1000000010000000100000001,就等于16843009,就完成了对一个INT元素的赋值了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-15 22:20:09

C++ memset 浅析的相关文章

Mosquitto pub/sub服务实现代码浅析-主体框架

Mosquitto 是一个IBM 开源pub/sub订阅发布协议 MQTT 的一个单机版实现(目前也只有单机版),MQTT主打轻便,比较适用于移动设备等上面,花费流量少,解析代价低.相对于XMPP等来说,简单许多. MQTT采用二进制协议,而不是XMPP的XML协议,所以一般消息甚至只需要花费2个字节的大小就可以交换信息了,对于移动开发比较有优势. IBM虽然开源了其MQTT消息协议,但是却没有开源其RSMB服务端程序,不过还好目前有比较稳定的实现可用,本文的Mosquitto是其中比较活跃的实

[转]浅析/sys/class目录的创建流程

浅析/sys/class目录的创建流程 /sys/class目录创建成功之后,其他的driver就可以调用struct class *class_create(struct module *owner, const char *name);int class_register(struct class *cls);成功向class添加自己的目录和attr文件了.    因为sysfs是一个内存文件系统,所以文件的物理存储关系就需要使用sd来维护,因此sysfs_dirent即sd就类似于硬盘中的

浅析Scanf源码

记得当初从C语言学习开始就使用scanf,关于scanf的用法也略知一二,对使用scanf出现的问题并未进行深刻探究,故笔者打算对scanf实现进行探究. 如何找到scanf源码 关于VC中的CRT代码在 VS目录下的\VC\crt\src中,我们就先把scanf.c扒出来. int __cdecl scanf ( const char *format, ... ) { va_list arglist; va_start(arglist, format); return vscanf_fn(_i

(Android系统)android property浅析

android property,相信各位android平台的开发人员用到的不会少,但是property的具体机制大家可能知道的不多,这里利用空闲时间大致了解了一些,特此分享跟大家,如有谬误,欢迎指正 android 1号进程进程init进程在开机的时候就会调用property_init函数,至于init是怎么起来的,这里不是重点,所以暂时先不介绍,property_init的具体flow如下: system/core/init/init.c void property_init(void) {

浅析树状数组

目录 beginning 顺序结构 A+B 高精 A+B 压位高精 A+B 二分A+B 树状数组简介(不喜欢啰嗦的请直接跳到这里) 基础概念 代码实现 大体结构 lowbit lowbit的作用 总结+代码 逆序对 离散化 方式 实现 代码 树状数组进阶 差分 区间修改+单点查询 主要思想 单点查询 区间修改 区间修改+区间查询 差分分析 代码 2D树状数组 query update 区间修改+单点查询 区间修改+区间查询 时间复杂度 罗列例题 一维 beginning 顺序结构 A+B 高精

Python之encode与decode浅析

 Python之encode与decode浅析 在 python 源代码文件中,如果你有用到非ASCII字符,则需要在文件头部进行字符编码的声明,声明如下: # code: UTF-8 因为python 只检查 #.coding 和编码字符串,为了美观等原因可以如下写法: #-*-coding:utf-8-*- 常见编码介绍: GB2312编码:适用于汉字处理.汉字通信等系统之间的信息交换. GBK编码:是汉字编码标准之一,是在 GB2312-80 标准基础上的内码扩展规范,使用了双字节编码.

浅析PHP的开源产品二次开发的基本要求

浅析PHP的开源产品二次开发的基本要求 第一, 基本要求:HTML(必须要非常熟悉),PHP(能看懂代码,能写一些小系统,如:留言板,小型CMS),Mysql(至少会一种数据库),Javascript(能看懂,能改现成的一些代码),Div+Css(能进行界面的调整,明白CSS是怎么使用的) 第二, 熟悉开源产品的使用,比如 Dedecms,你要知道怎么登录,怎么新建栏目,怎么添加文章,模板标签的使用方法,模型的概念和使用方法等等一些功能 第三, 要熟悉这个开源产品的数据库结构,还要理解里面核心文

word-break|overflow-wrap|word-wrap——CSS英文断句浅析

---恢复内容开始--- word-break|overflow-wrap|word-wrap--CSS英文断句浅析 一 问题引入 今天在再次学习 overflow 属性的时候,查看效果时,看到如下结果,内容在 div 中国换行了,可是两个 P 元素的内容并没有换行,搜索一番没有找到系统的答案,截图到群里请教大神,才知道是英文断句的问题,但是还是不太明白.之前没有遇到这种情况,为了彻底搞清楚,英文断句,又开始学习英文断句到底是怎么回事. 二 换行 每种语言里都有换行,就中文而言,我们最小语言单位

浅析vanish

浅析 VANISH --一种cache 第一部分:理解vanish的准备工作 1.对CDN的小剖析 CDN  content  delivery  network  内容分发(推送)网络,是在现有的Internet中增加一层新的网络架构,将网络内容发布到最接近用户的网络边缘(边缘服务器),使用户最近取得所需内容,解决网络拥挤状态,提高用户访问网站的速度. CDN网络架构主要有两部分组成,中心和边缘两部分,中心指CDN网管中心和DNS重定向解析中心,负责全局负载均衡.边缘主要指异地节点,CDN分发