竞赛中经常使用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函数的使用原理相关推荐

  1. 一个memset函数使用时的坑

    平时使用memset函数都是用来初始化字符串,从来没有注意过它具体是怎么实现的,最近无意中发现原来这个函数里面还是有坑的. 我尝试用它来初始化整型数组 int array[10]; memset(ar ...

  2. 函数解析|memset()函数的原理

    文章目录 1.函数原理 # 两个特例 如何将int类型的数字赋值为1 ? 2.日常方法 2.1初始化字节 2.2 初始化其他数据类型 2.3 初始化结构体 竞赛中Memset中无穷大常量的设定技巧 1 ...

  3. 【note】fill函数和memset函数的区别和使用

    memset函数 按照字节填充某字符 在头文件<cstring>里面 fill函数 按照单元赋值,将一个区间的元素都赋同一个值 在头文件<algorithm>里面 注意: fi ...

  4. Linux select函数用法和原理

    select函数的用法和原理 Linux上的select函数 select函数用于检测一组socket中是否有事件就绪.这里的事件为以下三类: 读事件就绪 在socket内核中,接收缓冲区中的字节数大 ...

  5. 一直误解的memset函数

    1."想当然"导致的后果 今天犯了一个十分低级的错误,在对一个整型数组用memset进行初始化设置所有元素值为1.可是结果却大出所料,很意外啊!接着,我就做了代码测试. #incl ...

  6. memset()函数的用法详解

    前言 最近做题时突然想到用memset给数组的元素赋值100,但是发现结果和想象中的不一样 通过debug看到数组中的元素的值都为1684300900,而明明给它的是100,这是为什么呢,于是查阅了一 ...

  7. php trim 过滤符号,phptrim_php过滤函数trim实现原理

    摘要 腾兴网为您分享:php过滤函数trim实现原理,智学网,小红书,问作业,调音器等软件知识,以及网信理财app,金山同城游戏,酒仙网app,悍将传世,天正建筑tarch8.5,蜗牛移动充话费,谷歌 ...

  8. java memset函数_memset函数及注意事项

    memset函数的原型为:void * memset(void *ptr,int value,size_t num);用于为地址ptr开始的num个字节赋值value. memset函数的头文件为:C ...

  9. memset()函数用法及其作用

    memset()函数原型是: extern void *memset(void *buffer, int c, int count) //buffer:为指针或是数组, //c:是赋给buffer的值 ...

最新文章

  1. 语义分割网络经典:unet
  2. 面试题16: 数值的整数次方
  3. Project Management Library项目管理甘特图控件
  4. 中国大学MOOC 计算机组成原理第5章 测试(下)
  5. CSS——规避脱标流和vertical-align
  6. 趣话题:git三部曲(二)-拆分历史提交记录reset
  7. JEEWX推出插件开发机制,现招募兴趣爱好者
  8. 2.Java 面试题整理(基础篇二)
  9. idea 和 maven学习
  10. amd64_or_ia64?
  11. C# 邮件类 Mailmessage
  12. 亚马逊的人工智能将实时语音识别错误率降低了6.2%
  13. canvas实现圆饼图,柱状图,折线图(满满的干货)
  14. HBase-2.0 MOB解决海量图片存储方案
  15. C# 利用Excel及Spire.xls实现用户自定义打印模板
  16. 统计独立访客需求mysql_网站流量分析项目day04
  17. 打印后台处理程序服务怎么开启
  18. 各品牌主板、笔记本、台式机启动快捷键
  19. java面试换背景颜色_正在修生养息,突然收到阿里(蚂蚁)面试电话,四面阿里面经总结...
  20. 录屏软件哪个好?五款免费视频录屏软件

热门文章

  1. 找了台服务器将磁力链接爬虫架设起来http://www.51bt.cc(51搜索)大家可以看下。
  2. python指定爬取新浪新闻
  3. Java基础JDK命令行工具(jps,jstat,jinfo,jmap,jhat,jstack)
  4. 2019如何快速养实时号引流精准粉丝?微博引流实战技巧篇
  5. 同期对比图_醋酸乙酯:同期利润大幅缩水
  6. AE镜头光晕插件:Optical Flares for Mac(支持ae2022)
  7. 分布式数字身份DID调研
  8. nextJs 跨域访问接口数据
  9. Linux中make命令详解
  10. 滑坡、沉降监测方案简析