memcpy în C

Copiază n octeți dintr-o zonă de memorie în alta; zonele nu au voie să se suprapună.

Sintaxă
#include <string.h>
void *memcpy(void *dest, const void *src, size_t n);

Ce face memcpy

memcpy copiază octet cu octet exact n octeți, indiferent ce conțin: numere, structuri, tablouri. Nu se oprește la '\0', deci nu pune terminatorul când copiezi text.

Numărul de octeți se scrie aproape mereu cu sizeof: pentru un tablou de 5 int, 5 * sizeof(int) sau direct sizeof tablou.

Dacă sursa și destinația se suprapun (de exemplu muți elemente în același tablou), rezultatul este nedefinit. Pentru acest caz există memmove.

Parametri

Parametru Descriere
dest Unde se copiază.
src De unde se copiază.
n Câți octeți se copiază.

Ce returnează

Pointerul dest.

Exemple

Exemplul 1: Copierea unui tablou de note

#include <stdio.h>
#include <string.h>

int main(void) {
    int note[5] = {9, 7, 10, 8, 6};
    int copie[5];
    memcpy(copie, note, sizeof note);
    copie[0] = 5;
    for (size_t i = 0; i < 5; i++) {
        printf("%d/%d ", note[i], copie[i]);
    }
    printf("\n");
    return 0;
}

Rezultat

9/5 7/7 10/10 8/8 6/6

Exemplul 2: Copierea unei părți dintr-un șir

Copiem doar primele 4 octeți și punem singuri terminatorul.

#include <stdio.h>
#include <string.h>

int main(void) {
    const char *data = "2026-10-25";
    char an[5];
    memcpy(an, data, 4);
    an[4] = '\0';
    printf("Anul: %s\n", an);
    return 0;
}

Rezultat

Anul: 2026

Greșeli frecvente

  • Dai numărul de elemente în loc de numărul de octeți: memcpy(dest, src, 5) pentru 5 int copiază doar 5 octeți, nu 20.
  • Folosești memcpy cu zone care se suprapun. Folosește memmove.
  • Copiezi o structură care conține pointeri și crezi că ai copiat și datele la care arată. Se copiază doar adresele (copie superficială).

Comenzi înrudite

  • memmove: Copiază n octeți ca memcpy, dar funcționează corect și când sursa și destinația se suprapun.
  • memset: Umple primii n octeți ai unei zone de memorie cu aceeași valoare, de obicei 0.
  • strcpy, strncpy și strdup: Copiază un șir C într-un alt tablou (strcpy, strncpy) sau într-o zonă nouă alocată cu malloc (strdup).
  • sizeof: Operatorul care spune câți octeți ocupă un tip sau o variabilă; calculat de compilator, rezultatul are tipul size_t.
  • void * (pointer generic): Un pointer care poate păstra adresa oricărui tip de date, dar care trebuie convertit la un tip concret înainte de folosire.