logo

memcpy () C

Funkcija memcpy () taip pat vadinama kopijavimo atminties bloko funkcija. Jis naudojamas tam tikro simbolių diapazono kopijai sukurti. Funkcija gali nukopijuoti objektus iš vieno atminties bloko į kitą atminties bloką tik tuo atveju, jei jie abu jokiu būdu nesutampa.

Sintaksė

Funkcijos memcpy() sintaksė C kalba yra tokia:

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

Funkcija memcpy () nukopijuos n nurodytą simbolį iš šaltinio masyvo arba vietos. Šiuo atveju arr1 į paskirties vietą yra arr2. Tiek arr1, tiek arr2 yra rodyklės, nukreipiančios atitinkamai į šaltinio ir paskirties vietą.

Parametras arba argumentai perduoti memcpy()

    arr1:tai pirmasis parametras funkcijoje, nurodančioje šaltinio atminties bloko vietą. Tai reiškia masyvą, kuris bus nukopijuotas į paskirties vietą.arr2:Antrasis funkcijos parametras nurodo paskirties atminties bloko vietą. Tai yra masyvas, kuriame bus nukopijuotas atminties blokas.n:Jis nurodo simbolių, nukopijuotų iš šaltinio į paskirties vietą, skaičių.

Grįžti

Jis grąžina rodyklę, kuri yra arr1.

Antraštės failas

Kadangi funkcija memcpy() yra apibrėžta string.h antraštės faile, ją būtina įtraukti į kodą, kad funkcija būtų įgyvendinta.

 #include 

Pažiūrėkime, kaip C programoje įdiegti funkciją memcpy ().

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

Pastaba: Nukopijuotame masyve paskutinį indeksą būtina nustatyti kaip nulį, nes funkcija tik kopijuoja duomenis, o ne inicijuoja pačios atminties. Eilutė tikisi nulinės reikšmės, kuri užbaigs eilutę.

Svarbūs faktai, į kuriuos reikia atsižvelgti prieš diegiant memcpy () programuojant C:

  • Funkcija memcpy() deklaruojama string.h antraštės faile. Taigi programuotojas turi užtikrinti, kad failas būtų įtrauktas į kodą.
  • Buferio, kuriame turi būti kopijuojamas turinys, dydis turi būti didesnis nei baitų, kurie turi būti nukopijuoti į buferį, skaičius.
  • Tai neveikia, kai objektai sutampa. Elgesys neapibrėžtas, jei bandome atlikti funkciją objektams, kurie persidengia.
  • Naudojant eilutes būtina pridėti nulinį simbolį, nes jis netikrina, ar eilutėse nėra baigiamųjų nulio simbolių.
  • Funkcijos elgsena nebus apibrėžta, jei funkcija pasieks buferį, viršijantį jo dydį. Buferio dydį geriau patikrinti naudojant sizeof() funkciją.
  • Tai neužtikrina, ar paskirties atminties blokas galioja sistemos atmintyje, ar 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; } 

Išvestis:

javascript apdaila
memcpy () C

Kodo veikimas neapibrėžtas, nes naujasis žymeklis nenurodo į jokią galiojančią vietą. Todėl programa neveiks tinkamai. Kai kuriuose kompiliatoriuose jis taip pat gali grąžinti klaidą. Pirmiau nurodytu atveju paskirties žymeklis neteisingas.

  • Funkcija memcpy () taip pat neatlieka šaltinio buferio patvirtinimo.
 #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; } 

Išvestis:

memcpy () C

Šiuo atveju išvestis taip pat yra panaši į pirmiau minėtą atvejį, kai paskirties vieta nebuvo nurodyta. Vienintelis skirtumas yra tas, kad jis nepateiks jokios kompiliavimo klaidos. Tai tiesiog parodys neapibrėžtą elgesį, nes šaltinio žymeklis nenurodo į jokią apibrėžtą vietą.

  • Funkcijos memcpy () veikia duomenų baitų lygiu. Todėl norint gauti norimus rezultatus, n reikšmė visada turi būti baitais.
  • Funkcijos memcpy() sintaksėje rodyklės paskelbiamos negaliojančiomis * tiek šaltinio, tiek paskirties atminties blokuose, o tai reiškia, kad jas galima naudoti nukreipiant į bet kokio tipo duomenis.

Pažiūrėkime kelis pavyzdžius, įgyvendinančius funkciją memcpy () skirtingiems duomenų tipams.

Funkcijos memcpy() įgyvendinimas su char tipo duomenimis

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

Išvestis:

memcpy () C

Čia inicijavome du 30 dydžio masyvus. sourcearr[] yra duomenys, kuriuos reikia nukopijuoti į destarr. Naudojome funkciją memcpy () norėdami išsaugoti duomenis destarr[].

žemėlapis vs rinkinys

Funkcijos memcpy(0) įgyvendinimas su sveikojo skaičiaus tipo duomenimis

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

Išvestis:

memcpy () C

Aukščiau pateiktame kode apibrėžėme struktūrą. Du kartus naudojome funkciją memcpy (). Pirmą kartą naudojome eilutei nukopijuoti į prsn1, o antrą kartą naudojome duomenims iš prsn1 kopijuoti į prsn2.

Apibrėžkite savo memcpy() funkciją C programavimo kalboje

Įdiegti funkciją memcpy () C programavimo kalba yra palyginti lengva. Funkcijos memcpy () logika yra gana paprasta. Norėdami įdiegti funkciją memcpy(), turite įvesti šaltinio adresą ir paskirties adresą į char*(1 baitas). Atlikę tipo siuntimą, nukopijuokite turinį iš šaltinio masyvo į paskirties adresą. Turime dalytis duomenimis baitas po baito. Kartokite šį veiksmą, kol baigsite n vienetų, kur n yra nurodyti kopijuotinų duomenų baitai.

Užkoduokime savo funkciją memcpy():

Pastaba: toliau pateikta funkcija veikia panašiai kaip tikroji funkcija memcpy(), tačiau daugelis atvejų vis tiek neatsižvelgiama į šią vartotojo apibrėžtą funkciją. Naudodami funkciją memcpy() galite nuspręsti konkrečias sąlygas, kurios turi būti įtrauktos į funkciją. Bet jei sąlygos nenurodytos, pageidautina naudoti funkciją memcpy (), apibrėžtą bibliotekos funkcijoje.

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

Parašykime tvarkyklės kodą, kad patikrintume, ar aukščiau pateiktas kodas tinkamai neveikia.

Tvarkyklės kodas MemCpy() funkcijai išbandyti

Žemiau esančiame kode naudosime arr1, norėdami nukopijuoti duomenis į arr2 naudodami funkciją MemCpy ().

kompiuterių tinklai
 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; } 

Išvestis:

memcpy () C