logo

memcpy() C:ssä

Memcpy()-funktiota kutsutaan myös Copy Memory Block -funktioksi. Sitä käytetään määritetyn merkkialueen kopioimiseen. Toiminto pystyy kopioimaan objektit yhdestä muistilohkosta toiseen vain, jos ne eivät mene päällekkäin missään vaiheessa.

Syntaksi

Memcpy()-funktion syntaksi C-kielellä on seuraava:

 void *memcpy(void *arr1, const void *arr2, size_t n); 

Memcpy()-funktio kopioi n määritetyn merkin lähdetaulukosta tai sijainnista. Tässä tapauksessa arr1 kohdesijaintiin on arr2. Sekä arr1 että arr2 ovat osoittimia, jotka osoittavat lähde- ja kohdesijaintiin.

Parametri tai argumentit välitetty memcpy()

    arr1:se on ensimmäinen parametri funktiossa, joka määrittää lähdemuistilohkon sijainnin. Se edustaa taulukkoa, joka kopioidaan kohteeseen.arr2:Toiminnon toinen parametri määrittää kohdemuistilohkon sijainnin. Se edustaa taulukkoa, johon muistilohko kopioidaan.n:Se määrittää lähteestä kohteeseen kopioitujen merkkien määrän.

Palata

Se palauttaa osoittimen, joka on arr1.

Otsikkotiedosto

Koska memcpy()-funktio on määritelty string.h-otsikkotiedostossa, se on sisällytettävä koodiin funktion toteuttamiseksi.

 #include 

Katsotaanpa, kuinka memcpy()-funktio toteutetaan C-ohjelmassa.

 //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; } 

Huomautus: Kopioidun taulukon viimeinen indeksi on asetettava tyhjäksi, koska toiminto kopioi vain tiedot eikä alusta itse muistia. Merkkijono odottaa nolla-arvon lopettavan merkkijonon.

Tärkeitä seikkoja, jotka on otettava huomioon ennen memcpy():n käyttöönottoa C-ohjelmoinnissa:

  • Memcpy()-funktio on ilmoitettu string.h-otsikkotiedostossa. Joten ohjelmoijan on varmistettava, että tiedosto sisällytetään koodiin.
  • Puskurin koon, jossa sisältö kopioidaan, on oltava suurempi kuin puskuriin kopioitavien tavujen määrä.
  • Se ei toimi, kun esineet menevät päällekkäin. Käyttäytyminen on määrittelemätön, jos yritämme suorittaa toiminnon päällekkäisille objekteille.
  • Merkkijonoja käytettäessä on lisättävä tyhjä merkki, koska se ei tarkista päättyviä nollamerkkejä merkkijonoista.
  • Toiminnon käyttäytymistä ei määritetä, jos funktio käyttää puskuria sen koon yli. Puskurin koko on parempi tarkistaa sizeof()-funktiolla.
  • Se ei takaa, että kohdemuistilohko on kelvollinen järjestelmän muistissa vai ei.
 #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; } 

Lähtö:

memcpy() C:ssä

Koodin toimintaa ei ole määritetty, koska uusi osoitin ei osoita mihinkään kelvolliseen sijaintiin. Tästä syystä ohjelma ei toimi kunnolla. Joissakin kääntäjissä se voi myös palauttaa virheen. Kohdeosoitin yllä olevassa tapauksessa on virheellinen.

  • Memcpy()-funktio ei myöskään suorita lähdepuskurin validointia.
 #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; } 

Lähtö:

memcpy() C:ssä

Tässä tapauksessa tulos on myös samanlainen kuin yllä olevassa tapauksessa, jossa kohdetta ei määritetty. Ainoa ero tässä on se, että se ei palauta käännösvirhettä. Se näyttää vain määrittelemättömän toiminnan, koska lähdeosoitin ei osoita mihinkään määritettyyn paikkaan.

  • Memcpy()-funktiot toimivat datan tavutasolla. Siksi n:n arvon tulee aina olla tavuissa haluttujen tulosten saamiseksi.
  • Memcpy()-funktion syntaksissa osoittimet julistetaan voideiksi * sekä lähde- että kohdemuistilohkolle, mikä tarkoittaa, että niitä voidaan käyttää osoittamaan mihin tahansa dataan.

Katsotaanpa joitain esimerkkejä memcpy()-funktion toteuttamisesta eri tietotyypeille.

ero rakkauden ja tykkäämisen välillä

Memcpy()-funktion toteuttaminen char-tyyppisillä tiedoilla

 #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; } 

Lähtö:

memcpy() C:ssä

Tässä on alustettu kaksi taulukkoa, joiden koko on 30. Lähdearr[] sisältää destarriin kopioitavat tiedot. Käytimme memcpy()-funktiota tietojen tallentamiseen destarr[]-tiedostoon.

Toteutetaan memcpy(0-funktiota kokonaislukutyyppisillä tiedoilla

 #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++){>

Lähtö:

memcpy() C:ssä

Yllä olevassa koodissa olemme määrittäneet rakenteen. Olemme käyttäneet memcpy()-funktiota kahdesti. Ensimmäisen kerran, kun käytimme sitä kopioimaan merkkijono prsn1:een, käytimme sitä toisella kerralla tietojen kopioimiseen prsn1:stä prsn2:een.

Määritä memcpy()-funktiosi C-ohjelmointikielellä

Memcpy()-funktion toteuttaminen C-ohjelmointikielellä on suhteellisen helppoa. Logiikka memcpy()-funktion takana on melko yksinkertainen. Memcpy()-funktion toteuttamiseksi sinun on kirjoitettava lähdeosoite ja kohdeosoite muotoon char*(1 tavu). Kun tyyppilähetys on suoritettu, kopioi sisältö lähdetaulukosta kohdeosoitteeseen. Meidän on jaettava data tavu kerrallaan. Toista tämä vaihe, kunnes olet suorittanut n yksikköä, jossa n on kopioitavan tiedon määritetyt tavut.

Koodataan oma memcpy()-funktiomme:

Huomautus: Alla oleva funktio toimii samalla tavalla kuin varsinainen memcpy()-funktio, mutta monia tapauksia ei silti huomioida tässä käyttäjän määrittämässä funktiossa. Käyttämällä memcpy()-funktiota voit päättää tiettyjä ehtoja sisällytettäväksi funktioon. Mutta jos ehtoja ei ole määritelty, on suositeltavaa käyttää kirjastofunktiossa määritettyä memcpy()-funktiota.

 //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; } 

Kirjoita ohjainkoodi tarkistaaksemme, että yllä oleva koodi toimii oikein.

Ohjainkoodi MemCpy()-funktion testaamiseksi

Alla olevassa koodissa käytämme arr1:tä kopioimaan tiedot arr2:een käyttämällä MemCpy()-funktiota.

 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; } 

Lähtö:

memcpy() C:ssä