0

0

c++中memset怎么初始化数组_c++内存填充函数【避坑】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-02-07 15:12:10

|

352人浏览过

|

来源于php中文网

原创

memset按字节填充,传入值转为unsigned char,故int数组填1得0x01010101(16843009)而非1;仅填0或-1安全,因对应全0或全1字节;char数组填非零值安全;现代C++推荐用{}、std::fill或vector初始化。

c++中memset怎么初始化数组_c++内存填充函数【避坑】

memset 初始化数组时为什么值总是不对

因为 memset字节填充,传入的整数值会被强制转成 unsigned char。比如 memset(arr, 1, sizeof(arr)) 看似想填 1,实际是每个字节都填 0x01,对 int 数组来说,每个元素变成 0x01010101(即 16843009),不是预期的 1。

  • 只安全用于初始化为 0 或 -1(-1 的补码是 0xFF,每个字节都是 0xFF)
  • 想填任意非零整数(如 5、-3),必须用循环或 std::fill
  • memset(arr, 0, sizeof(arr))memset(arr, -1, sizeof(arr)) 是仅有的两个“看起来像整数、实际能按元素生效”的常见用法

char 数组用 memset 填非零值是否安全

安全,但仅限于 charunsigned char 类型数组。因为 memset 本就是按字节操作,char 占 1 字节,填什么值就得到什么值。

  • char buf[100]; memset(buf, 'A', sizeof(buf)); → 每个元素都是字符 'A'
  • memset(buf, 0xFF, sizeof(buf)); → 每个元素都是 -1(char 有符号时)或 255(无符号时)
  • 别对 std::string 或含指针/对象的结构体用 memset,会破坏内部状态

替代 memset 的现代 C++ 写法有哪些

优先用类型安全、语义明确的方式,避免手动算字节数和类型陷阱。

闪电说
闪电说

AI语音输入法

下载
  • 初始化为 0:int arr[100]{};(聚合初始化,编译期完成)
  • 运行时填值:std::fill(std::begin(arr), std::end(arr), 42);
  • 动态数组:std::vector v(100, 7);(构造时直接指定初值)
  • 需要高性能批量清零且确定是 POD 类型:仍可用 memset,但务必确认目标类型是 trivially copyable 且不含虚函数/非平凡成员

memset 填 -1 后读取 int 元素为什么是 -1

因为 -1 的二进制补码表示在任意宽度整数中,所有位都是 1;memset(p, -1, n) 实际填的是 0xFF 字节,当解释为 int(假设 4 字节)时,0xFF_FF_FF_FF 就是 -1。

立即学习C++免费学习笔记(深入)”;

  • 这个技巧常用于初始化 int 数组为“无效标记值”,比如图算法中的 dist[] = {-1}
  • 但注意:它依赖于平台整数补码表示(C++20 起已规定为必须),且不适用于浮点数(0xFF...FF 不是合法 float)
  • shortlong long 同样成立,只要字节数匹配且系统用补码
容易被忽略的是:即使你只填 0 或 -1,也要确保 sizeof 计算的对象正确——填错大小(比如对指针用 sizeof(ptr) 而非 sizeof(*ptr))会导致部分内存未初始化或越界。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

606

2023.08.02

css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

581

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

104

2025.10.23

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

282

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

196

2025.07.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

606

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

551

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

173

2025.08.29

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

2

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CSS3 教程
CSS3 教程

共18课时 | 5.2万人学习

Sass 教程
Sass 教程

共14课时 | 0.8万人学习

Pandas 教程
Pandas 教程

共15课时 | 1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号