08.11.2014 Views

c_kitap

c_kitap

c_kitap

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

C ve Sistem Programcıları Derneği - C Ders Notları - Necati Ergin<br />

#include <br />

void *mymemcpy(void *vp1, const void *vp2, size_t n)<br />

{<br />

char *p1 = vp1;<br />

const char *p2 = vp2;<br />

while (n--)<br />

*p1++ = *p2++;<br />

}<br />

return vp1;<br />

int main()<br />

{<br />

int a[5] = {1, 2, 3, 4, 5};<br />

int b[5], i;<br />

mymemcpy(b, a, 10);<br />

for (i = 0; i < 5; ++i)<br />

printf("%d\n", b[i]);<br />

}<br />

return 0;<br />

Ancak memcpy işlevinin çakışık blokların kopyalanmasında davranışı güvence altında<br />

değildir.<br />

memmove işlevi<br />

memove da bir bloğu bir yerden bir yere kopyalar. İşlevin bildirimi memcpy işlevininki ile<br />

tamamen aynıdır.<br />

void *memmove(void *dest, const void *source, unsignt int nbytes);<br />

İki işlev arasındaki tek fark memmove işlevinin çakışık blokların kopyalanmasında<br />

davranışının güvence altında olmasıdır.<br />

Çakışık olmayan blokların kopyalanmasında memmove işlevi mi tercih edilmelidir? Hayır,<br />

bu iyi bir tavsiye olamaz. Çünkü:<br />

1. memmove işlevinin böyle bir güvence vermesinin ek bir yükü vardır.<br />

2. memmove işlevin kullanılması durumunda kodu okuyan kişi kopyalamanın yapıldığı<br />

blokla kopyalamanın yapılacağı blokların bir şekilde çakıştığı konusunda güçlü bir izlenim<br />

edinir.<br />

Bu durumda, kaynak blokla hedef bloğun çakışması durumunda ya da çakışma riskinin<br />

bulunduğu durumlarda memmove işlevi, aksi halde yani söz konusu blokların çakışmadığı<br />

kesinlikle biliniyorsa memcpy işlevi tercih edilmelidir.<br />

Aşağıda memmove işlevi için yazılan örnek bir kod yer alıyor:<br />

void *mymemmove(void *vp1, const void *vp2, unsigned int n)<br />

{<br />

char *p1 = vp1;<br />

const char *p2 = vp2;<br />

if (p1 > p2 && p2 + n > p1) {<br />

p1 += n;<br />

p2 += n;<br />

while (n--)<br />

*--p1 = *--p2;<br />

}<br />

286

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!