std::memset
来自cppreference.com
| 在标头 <cstring> 定义
|
||
| |
(1) | |
| |
(2) | (C++26 起) |
将值 static_cast<unsigned char>(ch) 复制到 dest 所指向对象的前 count 个字节中。
|
无论是否存在优化,调用 |
(C++26 起) |
如果 dest 所指向的对象满足以下任意条件,那么行为未定义:
- 该对象是潜在重叠的子对象。
- 该对象不可平凡复制 (TriviallyCopyable)
count大于该对象的大小。
参数
| dest | - | 指向要填充的对象的指针 |
| ch | - | 填充字节 |
| count | - | 要填充的字节数 |
返回值
dest
注解
如果 std::memset 所修改的对象在其生存期的剩余部分不再被访问,那么此函数可能会被优化掉(在如同规则下)(例如 gcc 漏洞 8537)。为此,此函数不能用于擦洗内存(例如以零填充存储密码的数组)。
对 std::memset_explicit 禁止此优化:保证进行内存写。C++26 前可以使用包含 volatile 指针的 std::fill。
该问题的第三方解决方案包含 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++11) |
检查类型是否可平凡复制 (类模板) |
memset 的 C 文档
| |