logo

C'de memcpy()

memcpy() işlevi aynı zamanda Bellek Bloğu Kopyalama işlevi olarak da adlandırılır. Belirli bir karakter aralığının kopyasını oluşturmak için kullanılır. İşlev, nesneleri bir bellek bloğundan başka bir bellek bloğuna ancak her ikisi de herhangi bir noktada çakışmıyorsa kopyalayabilir.

Sözdizimi

C dilinde memcpy() fonksiyonunun sözdizimi aşağıdaki gibidir:

dizeyi int olarak yayınla
 void *memcpy(void *arr1, const void *arr2, size_t n); 

Memcpy() işlevi, belirtilen n karakteri kaynak diziden veya konumdan kopyalayacaktır. Bu durumda, arr2 olan hedef konuma arr1'dir. Hem arr1 hem de arr2 sırasıyla kaynak ve hedef konuma işaret eden işaretçilerdir.

memcpy() işlevinde iletilen parametreler veya bağımsız değişkenler

    dizi1:kaynak bellek bloğunun konumunu belirten fonksiyondaki ilk parametredir. Hedefe kopyalanacak diziyi temsil eder.dizi2:İşlevdeki ikinci parametre, hedef bellek bloğunun konumunu belirtir. Bellek bloğunun kopyalanacağı diziyi temsil eder.N:Kaynaktan hedefe kopyalanan karakter sayısını belirtir.

Geri dönmek

arr1 olan bir işaretçi döndürür.

Başlık dosyası

Memcpy() fonksiyonu string.h başlık dosyasında tanımlandığından, fonksiyonun uygulanması için koda dahil edilmesi gerekmektedir.

 #include 

Memcpy() fonksiyonunun C programında nasıl uygulanacağını görelim.

 //Implementation of memcpy() in C Programming #include #include int main(int argc, const char * argv[]) { //initializing a variable that will hold the result./* Create a place to store our results */ int res; //declare the arrays for which you want to copy the data and //in which you want to copy it char orgnl[50]; char copy[50]; //Entering a string the orgnl array strcpy(orgnl, 'This is the program for implementing the memcpy() in C Program'); //use the memcpy() function to copy the characters from the source to destination. res = memcpy(copy, orgnl, 27); // we have specified n as 27 this means it will copy the first 27 character of //orgnl array to copy array //set the value for last index in the copy as 0 copy[27] = 0; //display the copied content printf('%s
', copy); return 0; } 

Not: İşlev yalnızca verileri kopyaladığından ve belleğin kendisini başlatmadığından, kopyalanan dizide son dizini null olarak ayarlamak gerekir. Dize, dizeyi sonlandırmak için boş bir değer bekler.

C Programlamada memcpy() uygulamasını uygulamadan önce dikkate alınması gereken Önemli Gerçekler:

  • memcpy() işlevi string.h başlık dosyasında bildirilir. Bu nedenle programcının dosyayı koda dahil ettiğinden emin olması gerekir.
  • İçeriğin kopyalanacağı arabelleğin boyutu, arabelleğe kopyalanacak bayt sayısından büyük olmalıdır.
  • Nesneler üst üste geldiğinde çalışmaz. İşlevi örtüşen nesneler üzerinde gerçekleştirmeye çalışırsak davranış tanımsızdır.
  • Dizelerdeki sonlandırıcı boş karakterleri kontrol etmediğinden, dizeleri kullanırken boş bir karakter eklemek gerekir.
  • İşlev, tampon belleğe kendi boyutunun ötesinde erişecekse, işlevin davranışı tanımlanmayacaktır. Sizeof() işlevini kullanarak arabellek boyutunu kontrol etmek daha iyidir.
  • Hedef hafıza bloğunun sistem hafızasında geçerli olup olmadığını garanti etmez.
 #include #include int main () { //The first step is to initialize the source and destination array. char* new; char orgnl[30] = 'Movetheobject'; //Print the contents before performing memcpy() function. printf('Before implementing memcpy() destination and source memory block respt is
 new = %s
 orgnl = %s
', new, orgnl); memcpy(new, orgnl, sizeof(orgnl)); //Display the content in both new and orgnl array after implementing memcpy. printf('After memcpy >> new = %s
 orgnl = %s
', new, orgnl); return 0; } 

Çıktı:

C'de memcpy()

Yeni işaretçi herhangi bir geçerli konumu işaret etmediğinden kodun davranışı tanımlanmadı. Bu nedenle program düzgün çalışmayacaktır. Bazı derleyicilerde hata da verebilir. Yukarıdaki durumda hedef işaretçisi geçersizdir.

  • Memcpy() işlevi aynı zamanda kaynak arabelleğinin doğrulanmasını da gerçekleştirmez.
 #include #include int main () { //The first step is to initialize the source and destination array. char new[10]= {1}; char *orgnl; //Print the contents before performing memcpy() function. printf('Before implementing memcpy() destination and source memory block respt is
 new = %s
 orgnl = %s
', new, orgnl); memcpy(new, orgnl, sizeof(orgnl)); //Display the content in both new and orgnl array after implementing memcpy. printf('After memcpy >> new = %s
 orgnl = %s
', new, orgnl); return 0; } 

Çıktı:

C'de memcpy()

Bu durumda çıktı, hedefin belirtilmediği yukarıdaki duruma da benzer. Buradaki tek fark, herhangi bir derleme hatası döndürmemesidir. Kaynak işaretçisi tanımlanmış herhangi bir konumu işaret etmediği için yalnızca tanımsız davranış gösterecektir.

  • Memcpy() işlevleri verinin bayt düzeyinde çalışır. Bu nedenle, istenen sonuçlar için n'nin değeri her zaman bayt cinsinden olmalıdır.
  • Memcpy() işlevinin sözdiziminde, işaretçiler hem kaynak hem de hedef bellek bloğu için void * olarak bildirilir; bu, bunların herhangi bir veri türüne işaret etmek için kullanılabileceği anlamına gelir.

Farklı veri türü verileri için memcpy() işlevini uygulayan bazı örnekleri görelim.

Memcpy() fonksiyonunun char tipi verilerle uygulanması

 #include #include int main() { //initialize the source array, //the data will be copied from source to destination/ char sourcearr[30] = 'This content is to be copied.'; //this is the destination array //data will be copied at this location. char destarr[30] = {0}; //copy the data stored in the sourcearr buffer into destarr buffer memcpy(destarr,sourcearr,sizeof(sourcearr)); //print the data copied into destarr printf('destination array content is now changed to
 = %s
', destarr); return 0; } 

Çıktı:

C'de memcpy()

Burada boyutu 30 olan iki diziyi başlattık. Sourcearr[], destarr'a kopyalanacak verileri içerir. Verileri destarr[]'da saklamak için memcpy() fonksiyonunu kullandık.

java if else ifadesi

Tamsayı tipi verilerle memcpy(0) fonksiyonunun uygulanması

 #include #include int main() { //initialize the source array, //the data will be copied from source to destination/ int sourcearr[100] = {1,2,3,4,5}; //this is the destination array //data will be copied at this location. int destarr[100] = {0}; //copy the data stored in the sourcearr buffer into destarr buffer memcpy(destarr,sourcearr,sizeof(sourcearr)); //print the data copied into destarr printf('destination array content is now changed to
&apos;); for(int i=0;i<5;i++){ printf('%d', destarr[i]); }return 0;} < pre> <p> <strong>Output:</strong> </p> <img src="//techcodeview.com/img/c-tutorial/16/memcpy-c-4.webp" alt="memcpy() in C"> <p>In this code, we have stored the integers in the array. Both the arrays can store int datatype. We have used the indexes to print the elements of the destarr after copying the elements of the sourcearr into destarr.</p> <h3>Implementing the memcpy() function with struct datatype</h3> <pre> #include #include struct { char name[40]; int age; } prsn1, prsn2; int main() { // char firstname[]=&apos;Ashwin&apos;; //Using the memcpy() function to copy the data from //firstname to the struct //add it is as prsn1 name memcpy ( prsn1.name, firstname, strlen(firstname)+1 ); //initialize the age of the prsn1 prsn1.age=20; //using the memcpy() function to copy one person to another //the data will be copied from prsn1 to prsn2 memcpy ( &amp;prsn2, &amp;prsn1, sizeof(prsn1) ); //print the stored data //display the value stored after copying the data //from prsn1 to prsn2 printf (&apos;person2: %s, %d 
&apos;, prsn2.name, prsn2.age ); return 0; } </pre> <p> <strong>Output:</strong> </p> <img src="//techcodeview.com/img/c-tutorial/16/memcpy-c-5.webp" alt="memcpy() in C"> <p>In the above code, we have defined the structure. We have used the memcpy() function twice. The first time we used it to copy the string into prsn1, we used it the second time to copy the data from the prsn1 to prsn2.</p> <h2>Define your memcpy() function in C Programming Language</h2> <p>Implementing the memcpy() function in the C Programming language is comparatively easy. The logic is quite simple behind the memcpy() function. To implement the memcpy() function, you must typecast the source address and the destination address to char*(1 byte). Once the typecasting is performed, now copy the contents from the source array to the destination address. We have to share the data byte by byte. Repeat this step until you have completed n units, where n is the specified bytes of the data to be copied.</p> <p>Let us code our own memcpy() function:</p> <h4>Note: The function below works similarly to the actual memcpy() function, but many cases are still not accounted for in this user-defined function. Using your memcpy() function, you can decide specific conditions to be included in the function. But if the conditions are not specified, it is preferred to use the memcpy() function defined in the library function.</h4> <pre> //this is just the function definition for the user defined memcpy() function. void * MemCpy(void* destinatn, const void* source, unsigned int cn) { char *pntDest = (char *)destinatn; const char *pntSource =( const char*)source; if((pntDest!= NULL) &amp;&amp; (pntSource!= NULL)) { while(cn) //till cn the loop will be executed { //copy the contents from source to dest //the data should be copied byte by byte *(pntDest++)= *(pntSource++); //decrement the value of cn --cn; } } return destinatn; } </pre> <p>Let us write a driver code to check that above code is working properly on not.</p> <p>Driver Code to test MemCpy() Function</p> <p>In the code below we will use the arr1 to copy the data into the arr2 by using MemCpy() function.</p> <pre> void * MemCpy(void* destinatn, const void* source, unsigned int cn) { char *pntDest = (char *)destinatn; const char *pntSource =( const char*)source; if((pntDest!= NULL) &amp;&amp; (pntSource!= NULL)) { while(cn) //till cn the loop will be executed { //copy the contents from source to dest //the data should be copied byte by byte *(pntDest++)= *(pntSource++); //decrement the value of cn --cn; } } return destinatn; } int main() { char src[20] = &apos;How Are you ?&apos;; //Source String char dst[20] = {0}; //dst buffer //copy source buffer int dst MemCpy(dst,src,sizeof(src)); printf(&apos;dst = %s
&apos;, dst); return 0; } </pre> <p> <strong>Output:</strong> </p> <img src="//techcodeview.com/img/c-tutorial/16/memcpy-c-6.webp" alt="memcpy() in C"> <hr></5;i++){>

Çıktı:

C'de memcpy()

Yukarıdaki kodda yapıyı tanımladık. Memcpy() fonksiyonunu iki kez kullandık. İlk kez dizeyi prsn1'e kopyalamak için kullandık, ikinci kez verileri prsn1'den prsn2'ye kopyalamak için kullandık.

C Programlama Dilinde memcpy() işlevinizi tanımlayın

Memcpy() fonksiyonunu C Programlama dilinde uygulamak nispeten kolaydır. Memcpy() fonksiyonunun mantığı oldukça basittir. Memcpy() fonksiyonunu uygulamak için kaynak adresini ve hedef adresini char*(1 bayt) olarak yazmanız gerekir. Typecasting gerçekleştirildikten sonra, şimdi içerikleri kaynak diziden hedef adrese kopyalayın. Verileri bayt bayt paylaşmamız gerekiyor. N adet birimi tamamlayana kadar bu adımı tekrarlayın; burada n, kopyalanacak verinin belirtilen baytıdır.

Kendi memcpy() fonksiyonumuzu kodlayalım:

Not: Aşağıdaki işlev, gerçek memcpy() işlevine benzer şekilde çalışır, ancak çoğu durum, bu kullanıcı tanımlı işlevde hâlâ hesaba katılmamaktadır. memcpy() işlevinizi kullanarak, işleve dahil edilecek belirli koşullara karar verebilirsiniz. Ancak koşullar belirtilmemişse kütüphane fonksiyonunda tanımlanan memcpy() fonksiyonunun kullanılması tercih edilir.

 //this is just the function definition for the user defined memcpy() function. void * MemCpy(void* destinatn, const void* source, unsigned int cn) { char *pntDest = (char *)destinatn; const char *pntSource =( const char*)source; if((pntDest!= NULL) &amp;&amp; (pntSource!= NULL)) { while(cn) //till cn the loop will be executed { //copy the contents from source to dest //the data should be copied byte by byte *(pntDest++)= *(pntSource++); //decrement the value of cn --cn; } } return destinatn; } 

Yukarıdaki kodun düzgün çalışıp çalışmadığını kontrol etmek için bir sürücü kodu yazalım.

MemCpy() İşlevini test etmek için Sürücü Kodu

Aşağıdaki kodda MemCpy() fonksiyonunu kullanarak verileri arr2'ye kopyalamak için arr1'i kullanacağız.

 void * MemCpy(void* destinatn, const void* source, unsigned int cn) { char *pntDest = (char *)destinatn; const char *pntSource =( const char*)source; if((pntDest!= NULL) &amp;&amp; (pntSource!= NULL)) { while(cn) //till cn the loop will be executed { //copy the contents from source to dest //the data should be copied byte by byte *(pntDest++)= *(pntSource++); //decrement the value of cn --cn; } } return destinatn; } int main() { char src[20] = &apos;How Are you ?&apos;; //Source String char dst[20] = {0}; //dst buffer //copy source buffer int dst MemCpy(dst,src,sizeof(src)); printf(&apos;dst = %s
&apos;, dst); return 0; } 

Çıktı:

C'de memcpy()