logo

memcpy() în C

Funcția memcpy() este numită și funcția Copiere bloc de memorie. Este folosit pentru a face o copie a unui interval specificat de caractere. Funcția poate copia obiectele dintr-un bloc de memorie într-un alt bloc de memorie doar dacă ambele nu se suprapun în niciun moment.

Sintaxă

Sintaxa pentru funcția memcpy() în limbajul C este următoarea:

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

Funcția memcpy() va copia caracterul n specificat din matricea sau locația sursă. În acest caz, este arr1 la locația de destinație care este arr2. Atât arr1, cât și arr2 sunt pointerii care indică locația sursă și, respectiv, destinație.

Parametru sau argumente transmise în memcpy()

    arr1:este primul parametru din funcție care specifică locația blocului de memorie sursă. Reprezintă matricea care va fi copiată la destinație.arr2:Al doilea parametru din funcție specifică locația blocului de memorie de destinație. Reprezintă matricea în care va fi copiat blocul de memorie.n:Specifică numărul de caractere copiate de la sursă la destinație.

Întoarcere

Returnează un pointer care este arr1.

converti un șir într-un număr întreg

Fișier antet

Deoarece funcția memcpy() este definită în fișierul antet string.h, este necesar să o includeți în cod pentru a implementa funcția.

 #include 

Să vedem cum să implementăm funcția memcpy() în programul 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; } 

Notă: Este necesar să setați ultimul index ca nul în matricea copiată, deoarece funcția copiază doar datele și nu inițializează memoria în sine. Șirul se așteaptă la o valoare nulă pentru a termina șirul.

Fapte importante care trebuie luate în considerare înainte de a implementa memcpy() în programarea C:

  • Funcția memcpy() este declarată în fișierul antet string.h. Deci, programatorul trebuie să se asigure că include fișierul în cod.
  • Mărimea buffer-ului în care urmează să fie copiat conținutul trebuie să fie mai mare decât numărul de octeți care trebuie copiați în buffer.
  • Nu funcționează când obiectele se suprapun. Comportamentul este nedefinit dacă încercăm să îndeplinim funcția asupra obiectelor care se suprapun.
  • Este necesar să adăugați un caracter nul atunci când utilizați șirurile de caractere, deoarece nu verifică caracterele nule de sfârșit din șiruri.
  • Comportamentul funcției nu va fi definit dacă funcția va accesa tamponul dincolo de dimensiunea acestuia. Este mai bine să verificați dimensiunea tamponului folosind funcția sizeof().
  • Nu asigură că blocul de memorie destinație este valabil sau nu în memoria sistemului.
 #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; } 

Ieșire:

memcpy() în C

Comportamentul codului nu este definit deoarece noul pointer nu indică către nicio locație validă. Prin urmare, programul nu va funcționa corect. În unele compilatoare, poate returna și o eroare. Indicatorul de destinație în cazul de mai sus este invalid.

  • Funcția memcpy() nu efectuează, de asemenea, validarea buffer-ului sursă.
 #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; } 

Ieșire:

memcpy() în C

Ieșirea, în acest caz, este, de asemenea, similară cu cea din cazul de mai sus, unde destinația nu a fost specificată. Singura diferență aici este că nu ar returna nicio eroare de compilare. Va arăta doar un comportament nedefinit, deoarece pointerul sursă nu indică către nicio locație definită.

traversarea în ordine a arborilor
  • Funcțiile memcpy() funcționează la nivel de octeți al datelor. Prin urmare, valoarea lui n ar trebui să fie întotdeauna în octeți pentru rezultatele dorite.
  • În sintaxa funcției memcpy(), pointerii sunt declarați void * atât pentru blocul de memorie sursă, cât și pentru cel de destinație, ceea ce înseamnă că pot fi utilizați pentru a indica orice tip de date.

Să vedem câteva exemple de implementare a funcției memcpy() pentru diferite tipuri de date.

Implementarea funcției memcpy() cu date de tip 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; } 

Ieșire:

algoritmi de sortare merge sort
memcpy() în C

Aici am inițializat două matrice de dimensiunea 30. Sourcearr[] conține datele care trebuie copiate în destarr. Am folosit funcția memcpy() pentru a stoca datele în destarr[].

Implementarea funcției memcpy(0 cu date de tip întreg

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

Ieșire:

memcpy() în C

În codul de mai sus, am definit structura. Am folosit funcția memcpy() de două ori. Prima dată când l-am folosit pentru a copia șirul în prsn1, l-am folosit a doua oară pentru a copia datele din prsn1 în prsn2.

Definiți funcția memcpy() în limbajul de programare C

Implementarea funcției memcpy() în limbajul de programare C este relativ ușoară. Logica este destul de simplă în spatele funcției memcpy(). Pentru a implementa funcția memcpy(), trebuie să introduceți adresa sursă și adresa destinație la char*(1 octet). Odată ce tipărirea este efectuată, copiați acum conținutul din matricea sursă la adresa de destinație. Trebuie să împărtășim datele octet cu octet. Repetați acest pas până când ați completat n unități, unde n este octeții specificați ai datelor de copiat.

Să codificăm propria noastră funcție memcpy():

Notă: Funcția de mai jos funcționează similar cu funcția memcpy(), dar multe cazuri încă nu sunt luate în considerare în această funcție definită de utilizator. Folosind funcția memcpy(), puteți decide anumite condiții care să fie incluse în funcție. Dar dacă nu sunt specificate condițiile, este de preferat să folosiți funcția memcpy() definită în funcția de bibliotecă.

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

Să scriem un cod de driver pentru a verifica dacă codul de mai sus funcționează corect și nu.

frații kylie jenner

Cod driver pentru a testa funcția MemCpy().

În codul de mai jos vom folosi arr1 pentru a copia datele în arr2 utilizând funcția 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; } 

Ieșire:

memcpy() în C