std::memset, std::memset_explicit
Определён в заголовочном файле <cstring> | ||
|---|---|---|
void* memset( void* dest, int ch, std::size_t count ); | (1) | |
void* memset_explicit( void* dest, int ch, std::size_t count ); | (2) | (начиная с C++26) |
Копирует значение static_cast<unsigned char>(ch) в каждый из первых count символов объекта, на который указывает dest.
| Вызов | (начиная с C++26) |
Если объект, на который указывает dest, удовлетворяет любому из следующих условий, поведение не определено:
- Объект является потенциально перекрывающимся подобъектом.
- Объект не является TriviallyCopyable.
-
countбольше размера объекта.
Параметры
| dest | - | указатель на заполняемый объект |
| ch | - | байт-заполнитель |
| count | - | количество заполняемых байтов |
Возвращаемое значение
dest
Примечания
std::memset может быть удалена оптимизатором (в соответствии с правилами as-if), если к изменённому этой функцией объекту больше не обращаются до конца его времени жизни (например, ошибка 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
См. также
| копирует один буфер в другой (функция) |
|
| перемещает один буфер в другой (функция) |
|
| копирует заданный широкий символ в каждую позицию массива широких символов (функция) |
|
| присваивает копированием заданное значение каждому элементу диапазона (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
| присваивает копированием заданное значение N элементам диапазона (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
|
(C++11) | проверяет, является ли тип тривиально копируемым (шаблон класса) |
Документация C для memset |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/string/byte/memset