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 5intcopiază doar 5 octeți, nu 20. - Folosești
memcpycu zone care se suprapun. Foloseștememmove. - 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.