std::memset

来自cppreference.com
< cpp‎ | string‎ | byte
在标头 <cstring> 定义
void* memset( void* dest, int ch, std::size_t count );

将值 static_cast<unsigned char>(ch) 复制到 dest 所指向对象的前 count 个字节中。若该对象是潜在重叠的子对象或非 可平凡复制 (TriviallyCopyable) (例如标量、 C 兼容的结构体或可平凡复制类型的数组),则行为未定义。若 count 大于 dest 所指向的对象大小,则行为未定义。

参数

dest - 指向要填充的对象的指针
ch - 填充字节
count - 要填充的字节数

返回值

dest

注解

std::memset 所修改的对象在其生存期的剩余部分不再被访问,则此函数可以被优化掉(在如同规则下)(例如 gcc 漏洞 8537)。为此,此函数不能用于擦洗内存(例如以零填充存储密码的数组)。

该问题的解决方案包含 volatile 指针的 std::fill(C23) memset_explicit()(C11) memset_s,FreeBSD explicit_bzero,或 Microsoft SecureZeroMemory

示例

#include <bitset>
#include <climits>
#include <cstring>
#include <iostream>
 
int main()
{
    int a[4];
    using bits = std::bitset<sizeof(int) * CHAR_BIT>;
    std::memset(a, 0b1111'0000'0011, sizeof a);
    for (int ai : a)
        std::cout << bits(ai) << '\n';
}

输出:

00000011000000110000001100000011
00000011000000110000001100000011
00000011000000110000001100000011
00000011000000110000001100000011

参阅

复制一个缓冲区到另一个
(函数)
移动一个缓冲区到另一个
(函数)
复制给定宽字符到宽字符数组的每个位置
(函数)
将一个给定值复制赋值给一个范围内的每个元素
(函数模板)
将一个给定值复制赋值给一个范围内的 N 个元素
(函数模板)
检查类型是否可平凡复制
(类模板)