Ce face std::memcpy
memcpy copiază exact n octeți, fără să se uite la conținut (nu se oprește la '\0'). Este cea mai rapidă copiere de memorie și se folosește pentru tablouri de numere, structuri simple sau date binare.
Dacă zona sursă și zona destinație se suprapun (de exemplu, muți elementele unui tablou cu o poziție), memcpy are comportament nedefinit. memmove face aceeași copiere, dar corect și pentru zone suprapuse.
n este în octeți: pentru 5 numere int scrii 5 * sizeof(int). Pentru obiecte C++ cu constructori (de exemplu std::string) folosește std::copy, nu memcpy.
Parametri
| Parametru | Descriere |
|---|---|
destinatie |
Unde se copiază. |
sursa |
De unde se copiază. |
n |
Numărul de octeți. |
Ce returnează
Pointerul destinatie.
Exemple
Exemplul 1: Copierea unui tablou de numere
#include <cstdio>
#include <cstring>
int main() {
int note[5] = {9, 7, 10, 8, 6};
int copie[5];
std::memcpy(copie, note, sizeof(note));
note[0] = 1; // originalul se schimbă, copia nu
for (int n : copie) std::printf("%d ", n);
std::printf("\n");
}
Rezultat
9 7 10 8 6
Exemplul 2: Mutare în același tablou cu memmove
Ștergem primul element mutând restul cu o poziție la stânga; zonele se suprapun, deci folosim memmove.
#include <cstdio>
#include <cstring>
int main() {
int coada[6] = {101, 102, 103, 104, 105, 0};
std::memmove(coada, coada + 1, 5 * sizeof(int));
for (int x : coada) std::printf("%d ", x);
std::printf("\n");
}
Rezultat
102 103 104 105 0 0
Greșeli frecvente
- Dai numărul de elemente în loc de numărul de octeți:
memcpy(dest, src, 5)copiază doar 5 octeți, adică unintși o bucată. - Folosești
memcpycu zone suprapuse: comportament nedefinit. Foloseștememmove. - Copiezi cu
memcpyobiecte care conținstd::stringsaustd::vector: se copiază pointerii interni, iar la distrugere aceeași memorie se eliberează de două ori.
Comenzi înrudite
std::memset: Umple n octeți de memorie cu aceeași valoare, de obicei pentru a pune totul pe zero.std::memcmp: Compară n octeți din două zone de memorie: 0 dacă sunt identici.std::strcpy: Copiază (strcpy, strncpy) sau lipește (strcat) șiruri C în tablouri de char.std::istream::read: Citește sau scrie un număr exact de octeți: read și write, pentru fișiere binare.