0

0

C++ memset函数用法详解_C++数组初始化与内存赋值陷阱

冰火之心

冰火之心

发布时间:2025-12-24 17:25:37

|

589人浏览过

|

来源于php中文网

原创

答案:memset是c++中按字节初始化内存的函数,适用于基本类型清零或单字节赋值,但不可用于浮点数非零初始化、类对象或复杂结构体,易导致未定义行为;应优先使用std::fill等安全方式。

c++ memset函数用法详解_c++数组初始化与内存赋值陷阱

在C++编程中,memset 是一个来自 C 标准库的函数,常用于对内存块进行快速初始化或清零。它定义在 头文件中(C 中为 ),虽然简单高效,但使用不当容易引发问题,尤其是在处理复杂类型时。本文将详细讲解其用法、适用场景以及常见陷阱。

memset 基本语法与工作原理

memset 的函数原型如下:

void* memset(void* ptr, int value, size_t num);
  • ptr:指向要填充的内存区域的指针。
  • value:要设置的值,以 int 形式传入,但实际是按字节赋值(取低8位)。
  • num:要设置的字节数。
  • 返回值:返回原始指针 ptr,便于链式调用。

该函数将从 ptr 开始的 num 个字节都设置为 value & 0xFF。注意:它是按字节操作,不是按数据类型操作。

适用于哪些类型?——基本类型的初始化

memset 最安全的应用场景是对基本数据类型数组进行初始化,尤其是清零操作。

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

例如,初始化一个整型数组为0:

int arr[10];
memset(arr, 0, sizeof(arr)); // 正确:每个字节设为0,整体变为0

也可以用于字符数组:

char str[100];
memset(str, 'A', sizeof(str)); // 所有字符设为 'A'

但要注意:只能赋值单字节可表示的值。比如想把整型数组设为 -1,可以:

int flags[50];
memset(flags, -1, sizeof(flags)); // 每个字节为 0xFF,int 变成 -1(补码)

因为 -1 的补码表示在每字节都是 0xFF,所以能正确生效。

MyMap AI
MyMap AI

使用AI将想法转化为图表

下载

常见陷阱:不能用于非POD类型和浮点数初始化

陷阱一:试图用 memset 初始化浮点数为非0值

float data[10];
memset(data, 1, sizeof(data)); // 错误!不是把每个 float 设为 1.0

这会把每个字节设为 1,即二进制 00000001,而 1.0f 的 IEEE 754 表示是 0x3F800000,完全不同。结果是未定义的浮点数值,不是 1.0。

陷阱二:对类对象或包含指针的结构体使用 memset

struct Person {
    std::string name;
    int age;
};
Person p;
memset(&p, 0, sizeof(p)); // 危险!破坏了 string 内部状态

这会导致 name 成员被强制清零,破坏其内部指针和长度信息,后续使用会引发崩溃。C++ 对象不应用 memset 初始化,应使用构造函数。

陷阱三:假设 memset 能设置任意整数值

int arr[5];
memset(arr, 2, sizeof(arr)); // 错误!不是每个元素为2

这会让每个字节变成 2,即每个 int 变成 0x02020202(小端下),不是 2。只有当目标值在所有字节上一致时才有效,如 0 或 -1。

替代方案与最佳实践

对于现代 C++,推荐使用更安全、语义更清晰的方式代替 memset

  • std::fill 给数组或容器赋值:
int arr[10];
std::fill(arr, arr + 10, 42); // 每个元素设为 42
  • std::vector 构造时初始化:
std::vector<int> vec(10, 0); // 10个0
  • 用大括号初始化聚合类型:
int arr[5] = {};     // 全为0
Person p = {};       // POD 类型清零(谨慎使用)

只有在性能敏感且确定目标是 POD 类型、只需按字节赋值(如清零)时,才考虑使用 memset。即便如此,也建议添加注释说明用途。

基本上就这些。memset 快速但危险,理解它的字节级本质是避免出错的关键。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

313

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

223

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

118

2026.02.12

string转int
string转int

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

910

2023.08.02

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

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

428

2025.06.09

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

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

201

2025.07.04

string转int
string转int

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

910

2023.08.02

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

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

598

2024.08.29

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

0

2026.03.03

热门下载

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

精品课程

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

共94课时 | 10.6万人学习

C 教程
C 教程

共75课时 | 5.1万人学习

C++教程
C++教程

共115课时 | 20.3万人学习

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

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