命名空间
变体
操作

std::memset

来自 cppreference.cn
< 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

[编辑] 注意

如果此函数修改的对象在其剩余生命周期内不再被访问(例如,gcc bug 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 个元素
(函数模板) [编辑]
检查类型是否为可平凡复制
(类模板) [编辑]
C 文档 关于 memset