命名空间
变体
操作

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 兼容结构体或一个 trivially copyable 类型的数组),则行为未定义。如果 count 大于 dest 指向的对象的大小,则行为未定义。

内容

[编辑] 参数

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

[编辑] 返回值

dest

[编辑] 注释

如果此函数修改的对象在其剩余的生命周期中不再被访问(例如,gcc 错误 8537),则 std::memset 可能被优化掉(根据 as-if 规则)。因此,此函数不能用于清除内存(例如,用零填充存储密码的数组)。

解决方法包括使用带 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 个元素
(函数模板) [编辑]
检查类型是否 trivially copyable
(类模板) [编辑]
C 文档 用于 memset