当前位置: 首页 > news >正文

纠正memset函数的用法

函数声明:void *memset(void *s, int c, size_t n);

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

一:普通理解

大家平时用的最多的就是对一个数组进行初始化。

例如

int data[100];

memset(data, 0, sizeof(data));

函数目的就是将data数组所有元素初始化为0. 有人经常把第三个参数写成:sizeof(int) * 100;其实也是一样的。具体原因稍后描述。

二:值得纠正和注意的地方

1.示例:memset(data, 1, sizeof(data))。显然目的是想将data的所有元素初始化成1,经过实验,发现不对,内存中出现大量的16843009。

不是我们想要的1。

原因剖析,memset函数是以字节为单位进行赋值的,他经常应用在对一个字符串的所有元素赋值。

例如

char data[20];

memset(data, '#', sizeof(data));

而示例1中的data是整型的,使用 memset还是按字节赋值,就是对data指向的内存的100个字节进行赋值,每个都用ASCII为1的字符去填充,转为二进制后,1就是00000001,占一个字节。一个INT元素是4 字节,合一起就是00000001000000010000000100000001,就等于16843009,就完成了对一个INT元素的赋值了。这样赋值完以后,每个数组元素的值实际上是0x01010101即十进制的16843009。你看看你输出结果是否这样?所以大家一定要记住memset是以字节为单位进行复制的。所以前面提到的关于第三个参数的两种写法都是正确的,应为他都是这个数组所占的字节个数。所以第三个参数你还可以直接写成100(对于前面那个例子)。 也能感受到memset用于把整型数组初始化为0,完全是对内存比较了解或者投机取巧的人弄出来的。我们用的时候一定要小心,要理解其原理。不然就会犯很多错误。

相关文章:

  • 在js中实现天数的加减
  • HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。
  • CentOS6.5 yum源设置
  • 九月腾讯,创新工场,淘宝等公司最新面试三十题(第171-200题)
  • Android RxVolley = Volley + RxJava + OkHttp
  • 记忆化递归
  • [SDOI 2009]HH去散步
  • 关于进程内存使用的一点学习和实践
  • java中容器的学习与理解
  • 华为C8650 手机带电脑上网 / 电脑带手机上网
  • Android零基础入门第75节:Activity状态和生命周期方法
  • Android之String国际化对照表
  • 2.3 js刷新页面所有 我的程序猿之路:第十三章
  • redisCheckMem脚本
  • 搜索引擎技术之概要预览
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 「译」Node.js Streams 基础
  • ES6--对象的扩展
  • ES6语法详解(一)
  • js写一个简单的选项卡
  • magento2项目上线注意事项
  • mysql_config not found
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • SpiderData 2019年2月16日 DApp数据排行榜
  • Spring核心 Bean的高级装配
  • SQLServer插入数据
  • Tornado学习笔记(1)
  • 大数据与云计算学习:数据分析(二)
  • 力扣(LeetCode)357
  • 排序算法之--选择排序
  • 普通函数和构造函数的区别
  • 前端面试总结(at, md)
  • 区块链将重新定义世界
  • 数组的操作
  • 无服务器化是企业 IT 架构的未来吗?
  • 携程小程序初体验
  • k8s使用glusterfs实现动态持久化存储
  • 说说我为什么看好Spring Cloud Alibaba
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​ArcGIS Pro 如何批量删除字段
  • ​Linux·i2c驱动架构​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • #162 (Div. 2)
  • #NOIP 2014# day.1 T2 联合权值
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (1)(1.13) SiK无线电高级配置(五)
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (zhuan) 一些RL的文献(及笔记)
  • (六)c52学习之旅-独立按键
  • (六)vue-router+UI组件库
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (一)Neo4j下载安装以及初次使用