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

memset函数详解

首先要知道memset函数是对字节为单位进行赋值的;

 

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

 

函数解释:将s中前n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
其实这里面的ch就是ascii为ch的字符;
将s所指向的某一块内存中的前n个 字节的内容全部设置为ch指定的ASCII值
/*************************************************************************************************************/

 

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

如果用memset(a,1,20);(实际上与memset(a,1,5*sizeof(int))结果是一样的)就是对a指向的内存的20个字节进行赋值,每个都用ASCⅡ为1的字符去填充,转为二进制后,1就是00000001,占一个字节。一个INT元素是4字节,合一起是0000 0001,0000 0001,0000 0001,0000 0001,转化成十六进制就是0x01010101,就等于16843009,就完成了对一个INT元素的赋值了。

 

/****************************************************************************************************************/
清零是memset(a,0,sizeof(a));
初始化为无穷大为memset(a,0x3f,sizeof(0x3f));
下面谈谈无穷大的用法;

0x3f3f3f3f的十进制是1061109567,也就是10^9级别的(和0x7fffffff一个数量级),而一般场合下的数据都是小于10^9的,所以它可以作为无穷大使用而不致出现数据大于无穷大的情形。

另一方面,由于一般的数据都不会大于10^9,所以当我们把无穷大加上一个数据时,它并不会溢出(这就满足了“无穷大加一个有穷的数依然是无穷大”),事实上0x3f3f3f3f+0x3f3f3f3f=2122219134,这非常大但却没有超过32-bit int的表示范围,所以0x3f3f3f3f还满足了我们“无穷大加无穷大还是无穷大”的需求。

最后,0x3f3f3f3f还能给我们带来一个意想不到的额外好处:如果我们想要将某个数组清零,我们通常会使用memset(a,0,sizeof(a))这样的代码来实现(方便而高效),但是当我们想将某个数组全部赋值为无穷大时(例如解决图论问题时邻接矩阵的初始化),就不能使用memset函数而得自己写循环了(写这些不重要的代码真的很痛苦),我们知道这是因为memset是按字节操作的,它能够对数组清零是因为0的每个字节都是0,现在好了,如果我们将无穷大设为0x3f3f3f3f,那么奇迹就发生了,0x3f3f3f3f的每个字节都是0x3f!所以要把一段内存全部置为无穷大,我们只需要memset(a,0x3f,sizeof(a))。

所以在通常的场合下,0x3f3f3f3f真的是一个非常棒的选择。

因为char是1字节,memset是按照字节赋值的,相当于把每个字节都设为那个数,所以char型的数组可赋任意值,int是4个字节,当memset(,1,sizeof()); 1相当于ASSCII码的1,1转为二进制00000001,当做一字节,一字节8位,int为4字节,所以初始化完每个数为00000001000000010000000100000001 = 16843009;

初始化最大值的方法:

如果你想初始最大化,第一位为符号位,不能为1,剩下全是1,也就是7个1,1111111化为

十六进制正好为0x7f,所以memset(,0x7f,sizeof());就可以了

 

 

相关文章:

  • Migration workstation vms to openstack kvm
  • Scala学习笔记(1)-环境搭建
  • Android平台调用Web Service:螺纹的引入
  • sed去掉文件中的空行
  • 前端手札--meta标记篇
  • 小技巧:Windows Server 2012R2 WiFi 无法连接问题
  • 在项目中引入领域驱动设计的经验
  • 【零基础学习iOS开发】【02-C语言】11-函数的声明和定义
  • 树莓派 安装 php
  • 互联网架构设想的大型应用软件,并建议
  • Android软硬整合技术(HALFramework)
  • httpry 升级版本 secihttp 发布了
  • 认为最重要的是:不要说自己正在「创业」(转)
  • 第一章 词汇陷阱
  • 在我的眼里,生产主管(1)——如何做竞争分析
  • ES6系统学习----从Apollo Client看解构赋值
  • iOS 颜色设置看我就够了
  • JavaScript HTML DOM
  • js ES6 求数组的交集,并集,还有差集
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Python中eval与exec的使用及区别
  • VuePress 静态网站生成
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 计算机常识 - 收藏集 - 掘金
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • 通过调用文摘列表API获取文摘
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (六)激光线扫描-三维重建
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (算法二)滑动窗口
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)shell调试方法
  • (转)大型网站的系统架构
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET delegate 委托 、 Event 事件
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .net分布式压力测试工具(Beetle.DT)
  • @selector(..)警告提示
  • @四年级家长,这条香港优才计划+华侨生联考捷径,一定要看!
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)
  • [BZOJ1040][P2607][ZJOI2008]骑士[树形DP+基环树]
  • [c++] C++多态(虚函数和虚继承)
  • [C++数据结构](31)哈夫曼树,哈夫曼编码与解码
  • [Docker]五.Docker中Dockerfile详解