std:: memset
|
定义于头文件
<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++11)
|
检查类型是否可平凡复制
(类模板) |
|
C 文档
for
memset
|
|