Spec-Zone.ru › C++

std::memset

Defined in header <cstring>
void* memset( void* dest, int ch, std::size_t count );

Копирует значение static_cast<unsigned char>(ch) в каждый из первых count символов объекта, на который указывает dest. Если объект является потенциально перекрывающимся подобъектом или не является TriviallyCopyable (например, скаляр, C-совместимый структуру или массив типа, который является trivially copyable), поведение не определено. Если count больше, чем размер объекта, на который указывает dest, поведение не определено.

Параметры

dest - указатель на объект, который нужно заполнить
ch - байт заполнения
count - количество байтов для заполнения

Возвращаемое значение

dest

Примечания

std::memset может быть оптимизирован (в соответствии с правилами as-if), если к объекту, изменённому этой функцией, больше не обращаются за время его существования (например, баг gcc 8537). По этой причине эту функцию нельзя использовать для очистки памяти (например, для заполнения массива, хранящего пароль, нулями).

Решение этой проблемы включает в себя использование std::fill с указателями volatile, (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

См. также

memcpy
копирует один буфер в другой
(функция)
memmove
перемещает один буфер в другой
(функция)
wmemset
копирует заданный широкий символ в каждую позицию массива широких символов
(функция)
fill
копирует заданное значение в каждый элемент в диапазоне
(шаблон функции)
fill_n
копирует заданное значение в N элементов в диапазоне
(шаблон функции)
is_trivially_copyable
(C++11)
проверяет, является ли тип trivially copyable
(шаблон класса)
C документация для memset

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/string/byte/memset

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API