memset是C++中按字节初始化内存的函数,常用于将数组或结构体清零;其原型为void memset(void ptr, int value, size_t num),适用于POD类型,但不适用于含构造函数或STL的复杂类型,且对非0值的非字符类型初始化需谨慎,推荐用std::fill等替代。
在C++中,
memset
是一个用于内存初始化的函数,常用于将一块内存区域设置为某个特定的值(通常是0)。它定义在
头文件中(C语言中是
),虽然不是C++独有的,但在处理原始内存时非常实用。
memset 函数原型
void* memset(void* ptr, int value, size_t num);
ptr
:指向要填充的内存块的指针。
value
:要设置的值。注意:这个值是以
字节
为单位的,会被转换成 unsigned char。
num
:要设置的字节数。
返回值:返回传入的指针
ptr
,便于链式调用。
常见用途与示例
最常见的是将数组或结构体清零:
int arr[10];memset(arr, 0, sizeof(arr)); // 所有元素变为0
也可以用于结构体:
立即学习
“
C++免费学习笔记(深入)
”;
C函数速查手册(CHM版)
C函数速查手册(CHM版)
下载
struct Student {char name[20];int age;float score;};Student s;memset(&s, 0, sizeof(s)); // 清空整个结构体
注意事项与限制
按字节赋值
:memset 是按字节操作的。比如你想把整型数组设为 -1,
memset(arr, -1, sizeof(arr))
实际上每个字节都被设为 0xFF,对 int 来说就是 -1(补码表示),这是可行的。但如果你想设为 1,
memset(arr, 1, sizeof(arr))
每个字节都是 1,结果不是你想要的 1 1 1...,而是类似 0x01010101 的整数,这通常不是预期行为。
只适用于 POD 类型
:对于包含构造函数、虚函数、STL 容器等的复杂类对象,不能使用 memset,否则会破坏对象状态,导致未定义行为。
不要用于非字符类型的大范围初始化
:除非你清楚字节级别的含义,否则避免对 float、double 或自定义类型使用非0值的 memset。
与 fill、assign 等 C++ 方法对比
C++ 更推荐使用
标准库
算法进行初始化:
用
std::fill(arr, arr + n, 0)
替代 memset 初始化整型数组,语义更清晰。
用
vector(n, 0)
构造初始化好的容器。
对于类成员,使用构造函数初始化列表更安全。
memset 更适合底层操作、性能敏感场景或与C兼容的代码中。
基本上就这些。memset 简单高效,但要小心使用,理解它是“按字节”而非“按元素”操作的关键点。不复杂但容易忽略。