Namespaces
Variants

std:: memset

From cppreference.net
定义于头文件 <cstring>
void * memset ( void * dest, int ch, std:: size_t count ) ;

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

目录

参数

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

返回值

dest

注释

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

针对此问题的解决方案包括使用 std::fill 配合volatile指针、 (C23) memset_explicit() (C11) memset_s 、FreeBSD的 explicit_bzero 或微软的 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 文档 for memset