logo

мемцпи() у Ц

Функција мемцпи() се такође назива функција Копирај меморијски блок. Користи се за прављење копије одређеног опсега знакова. Функција је у стању да копира објекте из једног меморијског блока у други меморијски блок само ако се оба ни у једном тренутку не преклапају.

Синтакса

Синтакса функције мемцпи() у језику Ц је следећа:

искључите режим програмера
 void *memcpy(void *arr1, const void *arr2, size_t n); 

Функција мемцпи() ће копирати н специфицирани карактер из изворног низа или локације. У овом случају, арр1 до одредишне локације је арр2. И арр1 и арр2 су показивачи који указују на изворну и одредишну локацију, респективно.

Параметар или аргументи прослеђени у мемцпи()

    арр1:то је први параметар у функцији који специфицира локацију изворног меморијског блока. Представља низ који ће бити копиран на одредиште.арр2:Други параметар у функцији специфицира локацију одредишног меморијског блока. Представља низ у који ће меморијски блок бити копиран.н:Одређује број знакова копираних од извора до одредишта.

Повратак

Враћа показивач који је арр1.

Датотека заглавља

Пошто је функција мемцпи() дефинисана у датотеци заглавља стринг.х, неопходно је укључити је у код за имплементацију функције.

 #include 

Хајде да видимо како да имплементирамо функцију мемцпи() у Ц програму.

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

Напомена: Неопходно је поставити последњи индекс као нулл у копираном низу јер функција само копира податке и не иницијализује саму меморију. Стринг очекује да нулл вредност заврши стринг.

Важне чињенице које треба узети у обзир пре имплементације мемцпи() у Ц програмирање:

  • Функција мемцпи() је декларисана у датотеци заглавља стринг.х. Дакле, програмер мора осигурати да укључи датотеку у код.
  • Величина бафера у који садржај треба да се копира мора бити већа од броја бајтова који се копирају у бафер.
  • Не ради када се објекти преклапају. Понашање је недефинисано ако покушамо да извршимо функцију на објектима који се преклапају.
  • Неопходно је додати нул карактер када се користе стрингови јер се не проверава да ли у стринговима има завршних нул знакова.
  • Понашање функције неће бити дефинисано ако ће функција приступити баферу изван његове величине. Боље је проверити величину бафера помоћу функције сизеоф().
  • Не осигурава да је одредишни меморијски блок важећи у меморији система или не.
 #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; } 

Излаз:

мемцпи() у Ц

Понашање кода није дефинисано јер нови показивач не показује ни на једну исправну локацију. Дакле, програм неће исправно функционисати. У неким компајлерима може такође да врати грешку. Показивач одредишта у горњем случају је неважећи.

  • Функција мемцпи() такође не врши валидацију изворног бафера.
 #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; } 

Излаз:

мемцпи() у Ц

Излаз је у овом случају такође сличан ономе у горњем случају, где одредиште није наведено. Једина разлика је у томе што не враћа никакву грешку у компилацији. Само ће показати недефинисано понашање пошто изворни показивач не показује ни на једну дефинисану локацију.

  • Функције мемцпи() раде на нивоу бајтова података. Стога вредност н увек треба да буде у бајтовима за жељене резултате.
  • У синтакси за мемцпи() функцију, показивачи су проглашени неважећим * и за изворни и за одредишни меморијски блок, што значи да се могу користити за упућивање на било коју врсту података.

Хајде да видимо неке примере имплементације функције мемцпи() за различите типове података.

Имплементација функције мемцпи() са подацима типа цхар

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

Излаз:

мемцпи() у Ц

Овде смо иницијализовали два низа величине 30. Соурцеарр[] садржи податке које треба копирати у дестарр. Користили смо функцију мемцпи() за складиштење података у дестарр[].

Имплементација функције мемцпи(0 са подацима целобројног типа

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

Излаз:

мемцпи() у Ц

У горњем коду смо дефинисали структуру. Два пута смо користили функцију мемцпи(). Први пут када смо га користили да копирамо стринг у прсн1, користили смо га други пут да копирамо податке из прсн1 у прсн2.

Дефинишите своју функцију мемцпи() у програмском језику Ц

Имплементација функције мемцпи() у програмском језику Ц је релативно лака. Логика је прилично једноставна иза функције мемцпи(). Да бисте имплементирали функцију мемцпи(), морате укуцати изворну адресу и одредишну адресу у цхар*(1 бајт). Када се изврши преиначење типа, сада копирајте садржај из изворног низа на одредишну адресу. Морамо да делимо податке бајт по бајт. Понављајте овај корак док не завршите н јединица, где је н специфицирани бајт података који треба копирати.

Хајде да кодирамо нашу сопствену функцију мемцпи():

Напомена: Функција испод функционише слично стварној функцији мемцпи(), али многи случајеви још увек нису узети у обзир у овој функцији коју дефинише корисник. Користећи вашу мемцпи() функцију, можете одлучити о одређеним условима који ће бити укључени у функцију. Али ако услови нису наведени, пожељно је користити функцију мемцпи() дефинисану у функцији библиотеке.

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

Хајде да напишемо код драјвера да проверимо да ли горњи код исправно ради на не.

Код драјвера за тестирање функције МемЦпи().

У коду испод користићемо арр1 да копирамо податке у арр2 помоћу функције МемЦпи().

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

Излаз:

мемцпи() у Ц