memset是C++中按字节初始化内存的函数,常用于将数组或结构体清零;其原型为void memset(void ptr, int value, size_t num),适用于POD类型,但不适用于含构造函数或STL的复杂类型,且对非0值的非字符类型初始化需谨慎,推荐用std::fill等替代。

在C++中,memset 是一个用于内存初始化的函数,常用于将一块内存区域设置为某个特定的值(通常是0)。它定义在
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++免费学习笔记(深入)”;
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 简单高效,但要小心使用,理解它是“按字节”而非“按元素”操作的关键点。不复杂但容易忽略。











