memset函数的使用原理
竞赛中经常使用memset函数进行数组初始化,但只能初始为0, -1。哪怕写成:
int num[N];
memset(num, 1, sizeof(num));
num[0]也是个很大的数。
今天看了一下C标准库里面memset函数的源码,一切就清楚了
void *(memset)(void *s, int c, size_t n)
{const unsigned char uc = c;unsigned char *su;for (su = s; 0 < n; ++su, --n)*su = uc;return (s);
}
可以看出这个函数本身就是为字符数组设计的。
源码说明对于数组参数是按照字符数组的形式进行赋值的。
也就是c的值每次赋值给一个字节,而不是4个字节,c的类型是int类型,4个字节,
但只会赋值最低位的一个字节的内容。
当c是1的时候,二进制低8位就是0000001
最终int类型数组一个元素的内容就变成了 0000001000000100000010000001
明显是个很大的数。
那0跟-1为什么可以呢?
因为0的二进制表示全都是0,-1的二进制表示全都是1,
全0填充32位,int类型也是0
全1填充32位,int类型也是-1
知道了这个内部原理就可以利用一下了,
#define INF 0x3f3f3f3f
int num[N];
memset(num, INF, sizeof(num));
这样得到的数组里面的每一个元素数值都是INF
看一下INF的二进制表示:
00111111001111110011111100111111
可以看出低8位是00111111,也就是实际赋值时是用
00111111来填充一个int类型,结果正好也是
00111111001111110011111100111111
于是就成功用memset进行了赋值。
memset函数的使用原理相关推荐
- 一个memset函数使用时的坑
平时使用memset函数都是用来初始化字符串,从来没有注意过它具体是怎么实现的,最近无意中发现原来这个函数里面还是有坑的. 我尝试用它来初始化整型数组 int array[10]; memset(ar ...
- 函数解析|memset()函数的原理
文章目录 1.函数原理 # 两个特例 如何将int类型的数字赋值为1 ? 2.日常方法 2.1初始化字节 2.2 初始化其他数据类型 2.3 初始化结构体 竞赛中Memset中无穷大常量的设定技巧 1 ...
- 【note】fill函数和memset函数的区别和使用
memset函数 按照字节填充某字符 在头文件<cstring>里面 fill函数 按照单元赋值,将一个区间的元素都赋同一个值 在头文件<algorithm>里面 注意: fi ...
- Linux select函数用法和原理
select函数的用法和原理 Linux上的select函数 select函数用于检测一组socket中是否有事件就绪.这里的事件为以下三类: 读事件就绪 在socket内核中,接收缓冲区中的字节数大 ...
- 一直误解的memset函数
1."想当然"导致的后果 今天犯了一个十分低级的错误,在对一个整型数组用memset进行初始化设置所有元素值为1.可是结果却大出所料,很意外啊!接着,我就做了代码测试. #incl ...
- memset()函数的用法详解
前言 最近做题时突然想到用memset给数组的元素赋值100,但是发现结果和想象中的不一样 通过debug看到数组中的元素的值都为1684300900,而明明给它的是100,这是为什么呢,于是查阅了一 ...
- php trim 过滤符号,phptrim_php过滤函数trim实现原理
摘要 腾兴网为您分享:php过滤函数trim实现原理,智学网,小红书,问作业,调音器等软件知识,以及网信理财app,金山同城游戏,酒仙网app,悍将传世,天正建筑tarch8.5,蜗牛移动充话费,谷歌 ...
- java memset函数_memset函数及注意事项
memset函数的原型为:void * memset(void *ptr,int value,size_t num);用于为地址ptr开始的num个字节赋值value. memset函数的头文件为:C ...
- memset()函数用法及其作用
memset()函数原型是: extern void *memset(void *buffer, int c, int count) //buffer:为指针或是数组, //c:是赋给buffer的值 ...
最新文章
- 语义分割网络经典:unet
- 面试题16: 数值的整数次方
- Project Management Library项目管理甘特图控件
- 中国大学MOOC 计算机组成原理第5章 测试(下)
- CSS——规避脱标流和vertical-align
- 趣话题:git三部曲(二)-拆分历史提交记录reset
- JEEWX推出插件开发机制,现招募兴趣爱好者
- 2.Java 面试题整理(基础篇二)
- idea 和 maven学习
- amd64_or_ia64?
- C# 邮件类 Mailmessage
- 亚马逊的人工智能将实时语音识别错误率降低了6.2%
- canvas实现圆饼图,柱状图,折线图(满满的干货)
- HBase-2.0 MOB解决海量图片存储方案
- C# 利用Excel及Spire.xls实现用户自定义打印模板
- 统计独立访客需求mysql_网站流量分析项目day04
- 打印后台处理程序服务怎么开启
- 各品牌主板、笔记本、台式机启动快捷键
- java面试换背景颜色_正在修生养息,突然收到阿里(蚂蚁)面试电话,四面阿里面经总结...
- 录屏软件哪个好?五款免费视频录屏软件
热门文章
- 找了台服务器将磁力链接爬虫架设起来http://www.51bt.cc(51搜索)大家可以看下。
- python指定爬取新浪新闻
- Java基础JDK命令行工具(jps,jstat,jinfo,jmap,jhat,jstack)
- 2019如何快速养实时号引流精准粉丝?微博引流实战技巧篇
- 同期对比图_醋酸乙酯:同期利润大幅缩水
- AE镜头光晕插件:Optical Flares for Mac(支持ae2022)
- 分布式数字身份DID调研
- nextJs 跨域访问接口数据
- Linux中make命令详解
- 滑坡、沉降监测方案简析