تُسمى الدالة 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; }
ملاحظة: من الضروري تعيين الفهرس الأخير على أنه فارغ في المصفوفة المنسوخة لأن الوظيفة تقوم فقط بنسخ البيانات ولا تقوم بتهيئة الذاكرة نفسها. تتوقع السلسلة قيمة فارغة لإنهاء السلسلة.
حقائق مهمة يجب مراعاتها قبل تطبيق 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; }
انتاج:
لم يتم تعريف سلوك التعليمات البرمجية لأن المؤشر الجديد لا يشير إلى أي موقع صالح. وبالتالي فإن البرنامج لن يعمل بشكل صحيح. في بعض المترجمين، قد يُرجع خطأً أيضًا. مؤشر الوجهة في الحالة المذكورة أعلاه غير صالح.
- لا تقوم الدالة 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++){>
انتاج:
.04 ككسر
في الكود أعلاه، قمنا بتعريف الهيكل. لقد استخدمنا الدالة 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; }
دعونا نكتب رمز برنامج التشغيل للتأكد من أن الكود أعلاه يعمل بشكل صحيح.
رمز برنامج التشغيل لاختبار وظيفة 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++){>