BG MVC Model View Controller eğitim serisi yayında...

Ana sayfa > Programlama > C Programlama > C standart kütüphanesi > <string.h> > memmove

memmove() fonksiyonu

Bildirim

void* memmove(void *dest, const void *src, size_t n);

errno_t memmove_s(void *dest, rsize_t destsz, const void *src, rsize_t n); (C11)

Açıklama

Src parametresi ile gösterilen bellek bölgesindeki karakterleri, n parametre değeri kadar uzunlukta, dest parametresindeki bellek bölgesine kopyalar.

Eğer dest veya src parametrelerinden birisi NULL bir işaretçi ise, belirsiz sonuçlar elde edilir.

memmove_s() fonksiyonunda ayrıca, aşağıdaki hatalar çalışma zamanında algılanır ve tüm hedef aralığının [dest, dest+destsz) sıfırlanmasına neden olur (dest ve destsz parametre değerleri geçerliyse) ve yüklenmiş olan kısıtlayıcı işlem fonksiyonu çağrılır:

  • Dest veya src parametre değeri NULL bir işaretçi ise,
  • Destsz veya n parametre değeri RSIZE_MAX değerinden büyük ise,
  • N parametre değeri destsz parametre değerinden büyük ise (ara bellek aşımı oluşur).

Parametreler

dest: Src parametresindeki verilerin kopyalanacağı belleği gösteren işaretçidir.

src: Dest parametresine kopyalanacak karakterlerin bellek başlangıcını gösteren bir işaretçidir.

n: Kopyalanacak maksimum karakter sayısıdır.

destsz: Dest parametresinde değiştirilecek maksimum byte sayısıdır.

Dönüş değeri

Dönüş değeri;

Memmove() fonksiyonu dest parametre değerini geri döndürür.

Memmove_s() fonksiyonu başarı durumunda 0 değerini, hata durumunda sıfır olmayan değer geri döndürür. Hata durumunda ayrıca, dest NULL bir işaretçi değilse ve destsz geçerli bir değerse, dest ile gösterilen bellek bölgesine destsz kadar sıfır değeri yazar.

Örnek


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

int main(void)
{
    char cdizi1[] = "Bilgisayar";
    const char cdizi2[] = "Programlar";

    printf("cdizi1 bellek içeriği: %s, cdizi2 bellek içeriği: %s\n", cdizi1, cdizi2);

    memmove(cdizi1, cdizi2, 10);

    printf("cdizi1 bellek içeriği: %s, cdizi2 bellek içeriği: %s\n", cdizi1, cdizi2);

    return 0;
}


Yukarıdaki örnekte, program aşağıdaki satırları ekrana yazar.

cdizi1 bellek içeriği: Bilgisayar, cdizi2 bellek içeriği: Programlar
cdizi1 bellek içeriği: Programlar, cdizi2 bellek içeriği: Programlar

Program iki karakter dizisinin içeriklerini ekrana yazdıktan sonra ikinci karakter dizisinin içeriğini memmove() fonksiyonu ile birinci karakter dizisinin bellek adresine kopyalar. Sonra, karakter dizilerinin içeriklerini tekrar ekrana yazar.

Kaynak kodu

Copyright Public domain


void *memmove(void *dest, const void *src, size_t n)
{
  char *d = dest;
  const char *s = src;
  if(d < s) {
     while(n--)
       *d++ = *s++;
  }
  else {
     char *lasts = s + (n-1);
     char *lastd = d + (n-1);
     
	 while(n--)
       *lastd-- = *lasts--;
  }
  
  return dest;
}