ما هو الفرق بين memset وmemcpy في C
سؤال
ولقد قرأت رؤوس ظيفة، ولكن ما زلت غير متأكد بالضبط ما الفرق من حيث حالات الاستخدام.
المحلول
وmemcpy()
نسخ من مكان إلى آخر. memset()
فقط يضع كل قطعة من الذاكرة إلى نفس القيمة.
مثال:
memset(str, '*', 50);
وخط أعلاه يضع الأحرف 50 الأولى من شارع السلسلة ل* (أو أيا كان الحجة الثانية من memset).
memcpy(str2, str1, 50);
وخط النسخ المذكورة أعلاه الأحرف الأولى 50 من str1 إلى str2.
نصائح أخرى
وmemset()
يحدد كل من وحدات البايت في المخزن المؤقت المحدد إلى نفس القيمة، memcpy()
نسخ سلسلة من وحدات البايت من مكان آخر إلى المخزن المؤقت.
char a[4];
memset(a, 7, sizeof(char)*4);
/*
* a is now...
*
* +-+-+-+-+
* |7|7|7|7|
* +-+-+-+-+
*/
char b[] = {1,2,3,4};
char c[4];
memcpy(c, b, sizeof(char)*4);
/*
* c is now...
*
* +-+-+-+-+
* |1|2|3|4|
* +-+-+-+-+
*/
وmemset
يحدد كتلة من الذاكرة إلى قيمة واحدة. memcpy
نسخ المحتوى من كتلة إلى كتلة أخرى.
وربما تريد ان تكون مهتمة في الفرق بين memcpy
وmemmove
. كلا تفعل الشيء نفسه، ولكن الأخيرة تعمل حتى لو كان المصدر والوجهة التداخل.
وmemset()
لتعيين كافة وحدات البايت في كتلة من الذاكرة إلى قيمة حرف معينة. Memset أيضا يلعب فقط بشكل جيد مع char
كما انها قيمة التهيئة الخاصة به.
ونسخ memcpy()
بايت بين الذاكرة. هذا النوع من البيانات التي يتم نسخها غير ذي صلة، فإنه يجعل من مجرد نسخ بايت مقابل بايت.
وmemset ملء <م> الذاكرة م> مع بايت المستمر
وباطل * memset (باطل * ق، ج كثافة العمليات، ن size_t)؛
واستخدام memset هو مبرمج يمكن أن تملأ مباشرة مع الذاكرة وجه الخصوص. واستخدامات memcpy <م> ثابت م> مؤشر باطلا مصدر التي لا يمكن تغييرها.
وmemcpy نسخ <م> الذاكرة م> منطقة
وباطل * memcpy (* باطل دست، CONST باطل * SRC، ن size_t)؛
وmemcpy()
نسخ من مكان إلى آخر. memset()
فقط يضع كل قطعة من الذاكرة إلى نفسه.
وعلى سبيل المثال هنا يحدد طول سلسلة من شارع السلسلة ل* (أو أيا كان الحجة الثانية من memset).
memset(str, '*', strlen(str)+1);
وهنا نسخ طول سلسلة من SRC سلسلة لدست.
وmemcpy(dest, src, strlen(src)+1);