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
intcumemset: obții 16843009. Foloseștestd::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.