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

c 函数 memset使用注意事项

#include <cstdio>
#include <cstring>
int main() {int a[5];memset(a, -1, sizeof a);for (int i = 0; i < 5; i++) {printf("%d\n", a[i]);}return 0;
}

如上代码使用memset对一个数组进行初始化,输出的结果如下:

-1
-1
-1
-1
-1

但如果是初始化 代码写为memset(a, 1, sizeof a);,发现如下的结果

16843009
16843009
16843009
16843009
16843009

那么为什么前一个初始化可以呢?

首先看memset函数定义

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

这里,str是指向要填充的内存块的指针,c是要设置的值(虽然是int类型,但实际上只会使用该值的低8位),n是要设置的字节数。

那么其中关键在于会对要填充的内存块每一个字节8位都存上 c 里面的低8位内容。

当你使用memset对一个int数组使用-1进行填充时,由于-1在内存中以补码形式表示,对于一个32位的系统,-1的二进制表示为11111111 11111111 11111111 11111111。因此,当memset用-1填充时,它实际上将每个字节都设置为11111111,这正好使得每个int元素都变为了-1。

然而,当尝试用1来填充时,情况就不同了。1的二进制表示为00000001(只考虑一个字节)。如果你用1来填充一个int数组,memset会将每个字节都设置为00000001。对于32位的int来说,每个int元素将会是00000001 00000001 00000001 00000001,这并不等于1。对于一个32位系统,这个值实际上是16843009,而不是1。

其他用法还有可以初始化一个int 类型的数组内容全为 INF的0x3f3f3f3f,那么只需要写成这样即可memset(a, 0x3f, sizeof a);

相关文章:

  • Spring中最常用的11个扩展点
  • Vue+SpringBoot打造超市账单管理系统
  • [最佳实践] conda环境内安装cuda 和 Mamba的安装
  • 详解Java中集合的List接口实现的ArrayList方法 | Set接口实现的HashSet方法
  • leetcode 热题 100_找到字符串中所有字母异位词
  • 计算机组成原理-第七章 输入/输出系统【期末复习|考研复习】
  • 企业数字人虚拟形象定制解决方案
  • [SpringCloud] OpenFeign核心架构原理 (一)
  • 『运维备忘录』之 RegEx 正则表达式实例汇总
  • 学习JAVA的第十三天(基础)
  • 芋道项目部署问题指南
  • 常用“树”数据结构
  • 通信棒自动化测试工具
  • uni-app 系统状态栏高度CSS变量--status-bar-height
  • istio pod不启动及访问报RBAC错误问题解决
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • [译] React v16.8: 含有Hooks的版本
  • CentOS7简单部署NFS
  • Docker入门(二) - Dockerfile
  • Idea+maven+scala构建包并在spark on yarn 运行
  • Java Agent 学习笔记
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • MD5加密原理解析及OC版原理实现
  • Median of Two Sorted Arrays
  • React-redux的原理以及使用
  • ViewService——一种保证客户端与服务端同步的方法
  • webpack4 一点通
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 批量截取pdf文件
  • 浅谈Golang中select的用法
  • 小程序 setData 学问多
  • 栈实现走出迷宫(C++)
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • # Maven错误Error executing Maven
  • #控制台大学课堂点名问题_课堂随机点名
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (HAL库版)freeRTOS移植STMF103
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (离散数学)逻辑连接词
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)EXC_BREAKPOINT僵尸错误
  • (轉貼) UML中文FAQ (OO) (UML)
  • .FileZilla的使用和主动模式被动模式介绍
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .NET/C# 的字符串暂存池
  • /etc/fstab和/etc/mtab的区别
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • @kafkalistener消费不到消息_消息队列对战之RabbitMq 大战 kafka
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • [ Algorithm ] N次方算法 N Square 动态规划解决