logo

memcpy() u C-u

Funkcija memcpy() naziva se i funkcija kopiranja memorijskog bloka. Koristi se za izradu kopije određenog niza znakova. Funkcija može kopirati objekte iz jednog memorijskog bloka u drugi memorijski blok samo ako se ni u jednom trenutku ne preklapaju.

Sintaksa

Sintaksa za funkciju memcpy() u jeziku C je sljedeća:

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

Funkcija memcpy() kopirat će navedeni znak n iz izvornog niza ili lokacije. U ovom slučaju, to je arr1 do odredišne ​​lokacije koja je arr2. I arr1 i arr2 su pokazivači koji pokazuju na izvornu i odredišnu lokaciju.

Parametar ili argumenti proslijeđeni u memcpy()

    dolazak1:to je prvi parametar u funkciji koji specificira lokaciju izvornog memorijskog bloka. Predstavlja niz koji će se kopirati na odredište.dolazak2:Drugi parametar u funkciji određuje mjesto odredišnog memorijskog bloka. Predstavlja niz u koji će se memorijski blok kopirati.n:Određuje broj znakova kopiranih od izvora do odredišta.

Povratak

Vraća pokazivač koji je arr1.

Datoteka zaglavlja

Budući da je funkcija memcpy() definirana u datoteci zaglavlja string.h, potrebno ju je uključiti u kod za implementaciju funkcije.

je poseban lik
 #include 

Pogledajmo kako implementirati funkciju memcpy() u C programu.

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

Napomena: potrebno je postaviti zadnji indeks kao null u kopiranom nizu jer funkcija samo kopira podatke, a ne inicijalizira samu memoriju. Niz očekuje nultu vrijednost da završi niz.

Važne činjenice koje treba uzeti u obzir prije implementacije memcpy() u C programiranje:

  • Funkcija memcpy() deklarirana je u datoteci zaglavlja string.h. Dakle, programer mora osigurati uključivanje datoteke u kod.
  • Veličina međuspremnika u koji će se sadržaj kopirati mora biti veća od broja bajtova koji se kopiraju u međuspremnik.
  • Ne radi kada se objekti preklapaju. Ponašanje je nedefinirano ako pokušamo izvršiti funkciju na objektima koji se preklapaju.
  • Potrebno je dodati nulti znak kada koristite nizove jer se ne provjeravaju završni nulti znakovi u nizovima.
  • Ponašanje funkcije neće biti definirano ako funkcija pristupi međuspremniku izvan svoje veličine. Bolje je provjeriti veličinu međuspremnika pomoću funkcije sizeof().
  • Ne osigurava je li odredišni memorijski blok valjan u memoriji sustava ili 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; } 

Izlaz:

memcpy() u C-u

Ponašanje koda nije definirano jer novi pokazivač ne pokazuje ni na jednu valjanu lokaciju. Zbog toga program neće ispravno funkcionirati. U nekim prevoditeljima može vratiti i pogrešku. Odredišni pokazivač u gornjem slučaju nije valjan.

  • Funkcija memcpy() također ne provodi provjeru valjanosti izvornog međuspremnika.
 #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; } 

Izlaz:

memcpy() u C-u

Izlaz je u ovom slučaju također sličan onom u gornjem slučaju, gdje odredište nije navedeno. Jedina razlika je što ne vraća nikakvu pogrešku kompilacije. Samo će pokazati nedefinirano ponašanje jer pokazivač izvora ne pokazuje ni na jednu definiranu lokaciju.

  • Funkcije memcpy() rade na razini bajta podataka. Stoga bi vrijednost n uvijek trebala biti u bajtovima za željene rezultate.
  • U sintaksi za funkciju memcpy(), pokazivači su proglašeni nevažećim * za izvorni i odredišni memorijski blok, što znači da se mogu koristiti za pokazivanje prema bilo kojoj vrsti podataka.

Pogledajmo neke primjere implementacije funkcije memcpy() za različite vrste podataka.

Implementacija funkcije memcpy() s podacima 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; } 

Izlaz:

memcpy() u C-u

Ovdje smo inicijalizirali dva niza veličine 30. Izvorni arr[] sadrži podatke koji se kopiraju u destarr. Koristili smo funkciju memcpy() za pohranu podataka u destarr[].

Implementacija funkcije memcpy(0) s podacima tipa integer

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

Izlaz:

memcpy() u C-u

U gornjem kodu definirali smo strukturu. Dva puta smo koristili funkciju memcpy(). Prvi put kada smo ga upotrijebili za kopiranje niza u prsn1, koristili smo ga drugi put za kopiranje podataka iz prsn1 u prsn2.

Definirajte svoju funkciju memcpy() u programskom jeziku C

Implementacija funkcije memcpy() u programskom jeziku C relativno je jednostavna. Logika iza funkcije memcpy() prilično je jednostavna. Da biste implementirali funkciju memcpy(), morate upisati izvornu adresu i odredišnu adresu u char*(1 bajt). Nakon što je tipizacija izvršena, sada kopirajte sadržaj iz izvornog polja na odredišnu adresu. Moramo dijeliti podatke bajt po bajt. Ponavljajte ovaj korak dok ne dovršite n jedinica, gdje je n navedeni bajt podataka koji se kopira.

Kodirajmo vlastitu funkciju memcpy():

Napomena: funkcija u nastavku radi slično stvarnoj funkciji memcpy(), ali mnogi slučajevi još uvijek nisu uzeti u obzir u ovoj korisnički definiranoj funkciji. Pomoću svoje funkcije memcpy() možete odlučiti da će određeni uvjeti biti uključeni u funkciju. Ali ako uvjeti nisu navedeni, poželjno je koristiti funkciju memcpy() definiranu u funkciji biblioteke.

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

Napišimo kod upravljačkog programa da provjerimo radi li gornji kod ispravno na notu.

Kod upravljačkog programa za testiranje funkcije MemCpy().

U donjem kodu koristit ćemo arr1 za kopiranje podataka u arr2 pomoću 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) &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; } 

Izlaz:

memcpy() u C-u