std::memset în C++

Umple n octeți de memorie cu aceeași valoare, de obicei pentru a pune totul pe zero.

Sintaxă
#include <cstring>
void* memset(void* destinatie, int valoare, std::size_t n);

Ce face std::memset

memset(p, v, n) scrie valoarea v (convertită la un octet) în fiecare dintre cei n octeți de la adresa p. Cel mai des se folosește pentru a pune un tablou sau o structură simplă pe zero.

Lucrează pe octeți, nu pe elemente: memset(tablou_int, 1, ...) nu pune 1 în fiecare int, ci octetul 1 în fiecare octet (rezultă 16843009). Pentru alte valori decât 0 sau -1 la tablouri de numere, folosește std::fill.

Parametri

Parametru Descriere
destinatie Zona de memorie umplută.
valoare Octetul scris (0–255).
n Numărul de octeți.

Ce returnează

Pointerul destinatie.

Exemple

Exemplul 1: Punerea pe zero și umplerea cu un caracter

#include <cstdio>
#include <cstring>

int main() {
    int voturi[5];
    std::memset(voturi, 0, sizeof(voturi));
    for (int v : voturi) std::printf("%d ", v);
    std::printf("\n");

    char linie[11];
    std::memset(linie, '-', 10);
    linie[10] = '\0';
    std::printf("%s\n", linie);
}

Rezultat

0 0 0 0 0 
----------

Exemplul 2: Capcana: memset pune octeți, nu numere

#include <cstdio>
#include <cstring>

int main() {
    int a[3];
    std::memset(a, 1, sizeof(a));
    std::printf("%d %d %d\n", a[0], a[1], a[2]);
}

Rezultat

16843009 16843009 16843009

Greșeli frecvente

  • Vrei să pui 1 în fiecare element al unui tablou int cu memset: obții 16843009. Folosește std::fill.
  • Scrii sizeof(pointer) în loc de mărimea tabloului, când tabloul a fost primit ca parametru: se umplu doar 8 octeți.

Comenzi înrudite

  • std::memcpy: Copiază n octeți dintr-o zonă de memorie în alta; memmove permite zone suprapuse.
  • std::memcmp: Compară n octeți din două zone de memorie: 0 dacă sunt identici.