std::memcpy în C++

Copiază n octeți dintr-o zonă de memorie în alta; memmove permite zone suprapuse.

Sintaxă
#include <cstring>
void* memcpy(void* destinatie, const void* sursa, std::size_t n);
void* memmove(void* destinatie, const void* sursa, std::size_t n);

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ă un int și o bucată.
  • Folosești memcpy cu zone suprapuse: comportament nedefinit. Folosește memmove.
  • Copiezi cu memcpy obiecte care conțin std::string sau std::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.