1. memcpy
– Mis see on?
C-keeles on mäluga töötamisel andmete kopeerimine väga oluline toiming. Üks kõige tüüpilisemaid viise selleks on memcpy
funktsioon. See funktsioon kopeerib andmeid ühest mälupiirkonnast teise baitide kaupa. Kujutlege, et te viite esemeid kastist A kasti B – just selline on memcpy
tööpõhimõte. Siiski, memcpy
kasutamisel tuleb olla ettevaatlik. Kui määratud suurus või mälupiirkond ei ole sobiv, võib see põhjustada andmete rikkeid või programmi krahhi.
2. memcpy
tööpõhimõte ja käitumine
memcpy
funktsioonil on järgmine signatuur:
void *memcpy(void *dest, const void *src, size_t n);
dest
on sihtkoht (kuhu kopeeritakse), src
on allikas (millest kopeeritakse), ja n
on baitide arv, mida kopeerida. Näiteks saab järgmist koodi kasutades kopeerida massiivi:
char src[10] = "ABCDEF";
char dest[10];
memcpy(dest, src, 6); // kopeerib "ABCDEF"
See kood kopeerib src
massiivi esimesed 6 baiti dest
massiivi. Oluline on alati kontrollida, et kopeeritav andmesuurus sobib nii allika kui ka sihtkoha mälusuurusega. Kui suurus ei klapi, võib programm käituda ootamatult.

3. memcpy
varjatud ohud
Üks suurimaid ohte memcpy
kasutamisel on mälupiirkondade kattumine. Kui allikas ja sihtkoht asuvad osaliselt samas mälus, ei tööta memcpy
korrektselt. Näiteks järgmine kood võib põhjustada probleeme:
char data[] = "HelloWorld";
memcpy(data + 2, data, 5);
Selles näites kattuvad allikas ja sihtkoht, mis võib põhjustada kopeerimisel vigase tulemuse. Sellistes olukordades tuleks kasutada memmove
funktsiooni, mis on loodud arvestama kattuvate mälupiirkondadega ja toimib ohutumalt.
4. memcpy
parimad tavad
Siin on mõned soovitused, kuidas memcpy
turvaliselt kasutada:
- Kontrolli suurust: Veendu alati, et kopeeritavate baitide arv on õige. Kui sihtpiirkond on liiga väike, võib tekkida mälu ülekirjutamine (buffer overflow), mis võib põhjustada turvariske.
- Kontrolli NULL-osutajaid: Kui
src
võidest
on NULL, võib programm kokku joosta. Seetõttu tuleks enne kasutamist kontrollida, et osutajad viitavad kehtivatele mälupiirkondadele. - Väldi kattuvaid piirkondi: Ära kasuta
memcpy
funktsiooni juhul, kui allikas ja sihtkoht võivad kattuda. Sellistel juhtudel kasutamemmove
, mis on ohutum.

5. memcpy
jõudlus ja eelised
memcpy
suurim eelis on selle kiirus. Paljudes süsteemides on memcpy
optimeeritud riistvaratasandil ning sobib suurepäraselt suurte andmemahtude kopeerimiseks mittekattuvates mälupiirkondades. Näiteks suurte puhvrite või failide mällu laadimisel on memcpy
väga tõhus.
Kuid ära kasuta memcpy
liialt ainult jõudluse nimel. Kui on oht kattuvuseks või kui turvalisus on oluline, tuleks eelistada memmove
’i või teisi turvalisemaid funktsioone.
6. memcpy
alternatiivid: memmove
ja muud valikud
Kuigi memcpy
on väga kasulik, tasub meeles pidada ka alternatiivseid funktsioone. memmove
sobib hästi olukordadesse, kus mälupiirkonnad võivad kattuda, ning võimaldab turvalist andmete kopeerimist. Näiteks saab memmove
’i kasutada järgmiselt:
char data[] = "HelloWorld";
memmove(data + 2, data, 5);
Selles näites kopeerib memmove
andmed ilma neid rikkumata. Lisaks võivad mõne konkreetse kasutusjuhtumi jaoks sobivamad olla funktsioonid nagu strcpy
või strncpy
, seega on oluline valida õige tööriist vastavalt olukorrale.
7. Kokkuvõte
Selles artiklis selgitasime memcpy
funktsiooni C-keeles: kuidas see töötab, millised on peamised ohukohad, parimad kasutusviisid ning alternatiivsed funktsioonid. memcpy
on väga võimas tööriist, kuid selle turvaliseks kasutamiseks on vaja hoolikust. Eriti oluline on pöörata tähelepanu mäluturvalisusele ja suuruse kontrollile. Ja lõpuks, kui mälupiirkonnad kattuvad, kasuta kindlasti memmove
– see aitab sul vältida tõrkeid ja hoida programmi töökindlana.