命名空间
变体
操作

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 错误 8537),则 std::memset 可能会被优化掉(根据“如同”规则)。因此,此函数不能用于擦洗内存(例如,用零填充存储密码的数组)。

解决此问题的方法包括使用 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