std::memset
来自 cppreference.cn
在头文件 <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++11) |
检查类型是否为可平凡复制类型 (类模板) |
C 文档 用于 memset
|