menset的使用方法

menset的使用方法

cpp 复制代码
#include <cstring>  // 必须包含这个头文件!
memset(目标内存地址, 填充值, 填充的字节数);

填充值只能是「单字节值」

memset是按字节填充,所以:

  • ✅ 填充0:完全没问题(所有类型数组清空都能用);
  • ❌ 填充1:不要这么做!比如int占 4 字节,填充1会变成0x01010101(十进制 16843009),不是你想要的1
  • 总结:memset几乎只用来填充0(清空)或-1(特殊场景),其他值慎用。

为什么只能0和-1呢

核心原因是0 和 1 在二进制中的表示形式不同 ,加上memset是「按字节填充」,导致填充 0 时所有类型都能得到预期结果,填充 1 时只有单字节类型(如char)符合预期,多字节类型(如int)会出错。我用通俗的方式拆解这个逻辑:

一、先搞懂两个基础概念

1. 字节与多字节类型的存储

计算机中:

  • 1 个字节 = 8 位二进制(00000000 ~ 11111111);

  • char类型占 1 字节,int类型通常占 4 字节(不同编译器可能是 2/8 字节,以 4 字节为例);

  • 多字节类型(如int)的存储是「多个字节拼接」,比如int a = 1,在内存中存储为:

    plaintext

    复制代码
    字节1(低地址) | 字节2 | 字节3 | 字节4(高地址)
    00000001       | 00000000 | 00000000 | 00000000

    (小端存储,绝大多数系统的默认方式)

2. memset 的填充规则

memset不关心数组的类型,只把目标内存拆成「一个个独立的字节」,每个字节都填充成你指定的值,比如:

  • 填充值是0 → 每个字节都变成00000000
  • 填充值是1 → 每个字节都变成00000001

二、为什么填充 0 没问题?

int类型为例(4 字节),memset给每个字节填0

plaintext

复制代码
字节1 | 字节2 | 字节3 | 字节4
00000000 | 00000000 | 00000000 | 00000000

拼接后整个int的值就是0(十进制),完全符合 "清空数组为 0" 的预期。

不管是char(1 字节)、int(4 字节)、long long(8 字节),填充 0 时每个字节都是 0,拼接后整体值就是 0 → 所以所有类型数组清空都能用memset填 0。

三、为什么填充 1 会出错?

还是以int类型(4 字节)为例,memset给每个字节填1(二进制00000001):

plaintext

复制代码
字节1 | 字节2 | 字节3 | 字节4
00000001 | 00000001 | 00000001 | 00000001

把这 4 个字节拼接成int值:

  • 二进制:00000001 00000001 00000001 00000001
  • 十六进制:0x01010101
  • 十进制:1*2^24 + 1*2^16 + 1*2^8 + 1 = 16843009

这显然不是你想要的1!只有char类型(1 字节)填充 1 时,结果才是1(因为只有 1 个字节,没有拼接问题)。

四、为什么 - 1 是特例(可以填充)?

这是因为-1在二进制中是「全 1」(补码存储规则):

  • 1 字节的-111111111
  • 4 字节的-111111111 11111111 11111111 11111111

memset填充-1时,每个字节都变成11111111,拼接后不管是 1 字节 / 4 字节 / 8 字节类型,整体值都是-1 → 所以填充-1也是符合预期的。

五、总结(核心要点)

填充值 单字节类型(char) 多字节类型(int/long long) 能否用 memset 填充
0 结果为 0(正确) 结果为 0(正确) ✅ 可以
1 结果为 1(正确) 结果为 0x01010101(错误) ❌ 不可以
-1 结果为 - 1(正确) 结果为 - 1(正确) ✅ 可以

简单记:memset只适合填充「所有字节都相同」的值,只有0-1满足这个条件(0 是全 0,-1 是全 1),其他值(如 1、2、100)的多字节拼接结果都不符合预期。

对你的代码场景来说,只需要用memset填 0 清空数组就够了,这也是memset最常用、最安全的用法~

相关推荐
那个村的李富贵16 小时前
CANN加速下的AIGC“即时翻译”:AI语音克隆与实时变声实战
人工智能·算法·aigc·cann
power 雀儿16 小时前
Scaled Dot-Product Attention 分数计算 C++
算法
琹箐16 小时前
最大堆和最小堆 实现思路
java·开发语言·算法
renhongxia117 小时前
如何基于知识图谱进行故障原因、事故原因推理,需要用到哪些算法
人工智能·深度学习·算法·机器学习·自然语言处理·transformer·知识图谱
坚持就完事了17 小时前
数据结构之树(Java实现)
java·算法
算法备案代理17 小时前
大模型备案与算法备案,企业该如何选择?
人工智能·算法·大模型·算法备案
赛姐在努力.17 小时前
【拓扑排序】-- 算法原理讲解,及实现拓扑排序,附赠热门例题
java·算法·图论
野犬寒鸦19 小时前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
霖霖总总19 小时前
[小技巧66]当自增主键耗尽:MySQL 主键溢出问题深度解析与雪花算法替代方案
mysql·算法
rainbow688919 小时前
深入解析C++STL:map与set底层奥秘
java·数据结构·算法