Функцията memcpy() се нарича също функция Copy Memory Block. Използва се за създаване на копие на определен диапазон от знаци. Функцията е в състояние да копира обектите от един блок памет в друг блок памет само ако и двата не се припокриват в нито една точка.
Синтаксис
Синтаксисът за функцията memcpy() на езика C е както следва:
void *memcpy(void *arr1, const void *arr2, size_t n);
Функцията memcpy() ще копира посочения знак n от изходния масив или местоположение. В този случай това е arr1 до местоназначението, което е arr2. Както arr1, така и arr2 са указателите, които сочат съответно към местоположението на източника и дестинацията.
Параметър или аргументи, предадени в memcpy()
Връщане
Той връща указател, който е arr1.
Заглавен файл
Тъй като функцията memcpy() е дефинирана в заглавния файл string.h, е необходимо да я включите в кода, за да реализирате функцията.
#include
Нека да видим как да внедрим функцията memcpy() в 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; }
Забележка: Необходимо е да зададете последния индекс като null в копирания масив, тъй като функцията само копира данните и не инициализира самата памет. Низът очаква нулева стойност, за да прекрати низа.
Важни факти, които трябва да бъдат отчетени преди прилагането на memcpy() в C програмиране:
- Функцията memcpy() е декларирана в заглавния файл string.h. Така че програмистът трябва да гарантира, че включва файла в кода.
- Размерът на буфера, в който трябва да се копира съдържанието, трябва да бъде по-голям от броя на байтовете, които трябва да се копират в буфера.
- Не работи, когато обектите се припокриват. Поведението е недефинирано, ако се опитаме да изпълним функцията върху обектите, които се припокриват.
- Необходимо е да добавите нулев знак, когато използвате низовете, тъй като не проверява за крайните нулеви знаци в низовете.
- Поведението на функцията няма да бъде дефинирано, ако функцията има достъп до буфера извън неговия размер. По-добре е да проверите размера на буфера с помощта на функцията sizeof().
- Това не гарантира, че целевият блок памет е валиден в паметта на системата или не.
#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; }
Изход:
референтна променлива в java
Поведението на кода не е дефинирано, тъй като новият указател не сочи към никакво валидно местоположение. Следователно програмата няма да работи правилно. В някои компилатори може също да върне грешка. Указателят на дестинацията в горния случай е невалиден.
- Функцията memcpy() също не извършва валидирането на изходния буфер.
#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; }
Изход:
Резултатът в този случай също е подобен на този в горния случай, където дестинацията не е посочена. Единствената разлика тук е, че няма да върне грешка при компилиране. Той просто ще покаже недефинирано поведение, тъй като указателят на източника не сочи към нито едно дефинирано местоположение.
- Функциите memcpy() работят на ниво байт на данните. Следователно стойността на n винаги трябва да бъде в байтове за желаните резултати.
- В синтаксиса за функцията memcpy() указателите са декларирани като невалидни * както за източника, така и за блока на паметта за местоназначение, което означава, че те могат да се използват за насочване към всеки тип данни.
Нека видим някои примери за прилагане на функцията memcpy() за различни типове данни.
Внедряване на функцията memcpy() с данни от тип 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; }
Изход:
Тук сме инициализирали два масива с размер 30. sourcearr[] съдържа данните, които трябва да бъдат копирани в destarr. Използвахме функцията memcpy(), за да съхраним данните в destarr[].
Внедряване на функцията memcpy(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 '); 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++){>
Изход:
В горния код сме дефинирали структурата. Използвахме функцията memcpy() два пъти. Първият път, когато го използвахме, за да копираме низа в prsn1, го използвахме втория път, за да копираме данните от prsn1 в prsn2.
Дефинирайте вашата функция memcpy() на езика за програмиране C
Внедряването на функцията memcpy() в езика за програмиране C е сравнително лесно. Логиката зад функцията memcpy() е доста проста. За да приложите функцията memcpy(), трябва да преобразувате адреса на източника и адреса на местоназначение в char*(1 байт). След като се извърши преобразуването на типове, сега копирайте съдържанието от изходния масив на адреса на местоназначение. Трябва да споделяме данните байт по байт. Повторете тази стъпка, докато завършите n единици, където n е посочените байтове от данните, които трябва да бъдат копирани.
Нека кодираме нашата собствена функция memcpy():
Забележка: Функцията по-долу работи подобно на действителната функция memcpy(), но много случаи все още не са отчетени в тази дефинирана от потребителя функция. С помощта на вашата функция memcpy() можете да решите конкретни условия, които да бъдат включени във функцията. Но ако условията не са посочени, за предпочитане е да използвате функцията memcpy(), дефинирана във функцията библиотека.
//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; }
Нека напишем код на драйвер, за да проверим дали горният код работи правилно на not.
рекурсия в java
Код на драйвера за тестване на функцията MemCpy().
В кода по-долу ще използваме arr1, за да копираме данните в arr2, като използваме функцията 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; }
Изход:
5;i++){>