Funkcija memcpy() se imenuje tudi funkcija kopiranja pomnilniškega bloka. Uporablja se za izdelavo kopije določenega obsega znakov. Funkcija lahko kopira objekte iz enega pomnilniškega bloka v drugega pomnilniškega bloka le, če se oba na nobeni točki ne prekrivata.
Sintaksa
Sintaksa za funkcijo memcpy() v jeziku C je naslednja:
void *memcpy(void *arr1, const void *arr2, size_t n);
Funkcija memcpy() bo kopirala podani znak n iz izvorne matrike ali lokacije. V tem primeru je arr1 do ciljne lokacije, ki je arr2. Tako arr1 kot arr2 sta kazalca, ki kažeta na izvorno oziroma ciljno lokacijo.
Parameter ali argumenti, posredovani v memcpy()
Vrnitev
Vrne kazalec, ki je arr1.
Datoteka glave
Ker je funkcija memcpy() definirana v datoteki glave string.h, jo je treba vključiti v kodo za implementacijo funkcije.
#include
Poglejmo, kako implementirati funkcijo memcpy() v programu C.
//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; }
Opomba: v kopirani matriki je treba zadnji indeks nastaviti kot ničelno, saj funkcija samo kopira podatke in ne inicializira samega pomnilnika. Niz pričakuje ničelno vrednost za zaključek niza.
Pomembna dejstva, ki jih je treba upoštevati pred implementacijo memcpy() v programiranje C:
- Funkcija memcpy() je deklarirana v datoteki glave string.h. Zato mora programer zagotoviti, da datoteko vključi v kodo.
- Velikost vmesnega pomnilnika, v katerega naj se kopira vsebina, mora biti večja od števila bajtov, ki jih je treba kopirati v medpomnilnik.
- Ne deluje, ko se predmeti prekrivajo. Vedenje je nedefinirano, če poskušamo izvesti funkcijo na objektih, ki se prekrivajo.
- Pri uporabi nizov je treba dodati ničelni znak, saj ne preverja zaključnih ničelnih znakov v nizih.
- Vedenje funkcije ne bo definirano, če bo funkcija dostopala do medpomnilnika, ki presega njegovo velikost. Velikost medpomnilnika je bolje preveriti s funkcijo sizeof().
- Ne zagotavlja, ali je ciljni pomnilniški blok veljaven v pomnilniku sistema ali ne.
#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; }
Izhod:
Obnašanje kode ni definirano, ker novi kazalec ne kaže na nobeno veljavno lokacijo. Zato program ne bo pravilno deloval. V nekaterih prevajalnikih lahko vrne tudi napako. Ciljni kazalec v zgornjem primeru ni veljaven.
- Funkcija memcpy() tudi ne izvaja preverjanja veljavnosti izvornega medpomnilnika.
#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; }
Izhod:
Rezultat je tudi v tem primeru podoben kot v zgornjem primeru, kjer cilj ni bil določen. Edina razlika je, da ne vrne nobene napake pri prevajanju. Prikazal bo le nedefinirano vedenje, saj izvorni kazalec ne kaže na nobeno definirano lokacijo.
- Funkcije memcpy() delujejo na bajtni ravni podatkov. Zato mora biti vrednost n vedno v bajtih za želene rezultate.
- V sintaksi za funkcijo memcpy() so kazalci razglašeni za neveljavne * za izvorni in ciljni pomnilniški blok, kar pomeni, da jih je mogoče uporabiti za kazanje na katero koli vrsto podatkov.
Oglejmo si nekaj primerov implementacije funkcije memcpy() za različne vrste podatkov.
Implementacija funkcije memcpy() s podatki tipa char
#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; }
Izhod:
Tukaj smo inicializirali dve matriki velikosti 30. Izvorni arr[] vsebuje podatke, ki jih je treba kopirati v destarr. Uporabili smo funkcijo memcpy() za shranjevanje podatkov v destarr[].
Implementacija funkcije memcpy(0 s podatki celega tipa
#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 '); 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[]='Ashwin'; //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 ( &prsn2, &prsn1, sizeof(prsn1) ); //print the stored data //display the value stored after copying the data //from prsn1 to prsn2 printf ('person2: %s, %d ', 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) && (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) && (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] = 'How Are you ?'; //Source String char dst[20] = {0}; //dst buffer //copy source buffer int dst MemCpy(dst,src,sizeof(src)); printf('dst = %s ', 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++){>
Izhod:
V zgornji kodi smo definirali strukturo. Funkcijo memcpy() smo uporabili dvakrat. Prvič smo ga uporabili za kopiranje niza v prsn1, drugič pa za kopiranje podatkov iz prsn1 v prsn2.
Definirajte svojo funkcijo memcpy() v programskem jeziku C
Implementacija funkcije memcpy() v programskem jeziku C je sorazmerno enostavna. Logika za funkcijo memcpy() je precej preprosta. Če želite implementirati funkcijo memcpy(), morate izvorni naslov in ciljni naslov vnesti v char*(1 bajt). Ko je pretvorba tipov izvedena, kopirajte vsebino iz izvorne matrike na ciljni naslov. Podatke moramo deliti bajt za bajtom. Ponavljajte ta korak, dokler ne dokončate n enot, kjer je n določenih bajtov podatkov, ki jih želite kopirati.
Kodirajmo lastno funkcijo memcpy():
if else stavek v Javi
Opomba: spodnja funkcija deluje podobno kot dejanska funkcija memcpy(), vendar ta uporabniško definirana funkcija še vedno ne upošteva veliko primerov. S funkcijo memcpy() se lahko odločite, da bodo posebni pogoji vključeni v funkcijo. Če pa pogoji niso navedeni, je bolje uporabiti funkcijo memcpy(), definirano v funkciji knjižnice.
//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) && (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; }
Napišimo kodo gonilnika, da preverimo, ali zgornja koda pravilno deluje na not.
Koda gonilnika za preizkus funkcije MemCpy().
V spodnji kodi bomo uporabili arr1 za kopiranje podatkov v arr2 z uporabo funkcije MemCpy().
void * MemCpy(void* destinatn, const void* source, unsigned int cn) { char *pntDest = (char *)destinatn; const char *pntSource =( const char*)source; if((pntDest!= NULL) && (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] = 'How Are you ?'; //Source String char dst[20] = {0}; //dst buffer //copy source buffer int dst MemCpy(dst,src,sizeof(src)); printf('dst = %s ', dst); return 0; }
Izhod:
5;i++){>