شرح دالة ()memset في لغة سي بالأمثلة
تُستخدم دالة ()memset لملء حجرة من الذاكرة بقيمة محددة.
صيغة الدالة:
1
void *memset(void *ptr, int x, size_t n);
حيث يشير:
-
ptr إلى عنوان بداية الذاكرة المطلوب ملؤها
-
x القيمة التي سيتم الملء بها
-
n عدد البايتات التي سيتم ملؤها بدءًا من العنوان ptr
ولاحظ أن ptr هو مؤشر (pointer) من نوع void وبالتالي يمكن تمرير مؤشر من أي نوع في هذه الدالة.
لنلقِ نظرة الآن على مثال بسيطة لتوضيح عمل الدالة ()memset:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// C program to demonstrate working of memset()
#include <stdio.h>
#include <string.h>
int main()
{
char str[50] = "GeeksForGeeks is for programming geeks.";
printf("\nBefore memset(): %s\n", str);
// Fill 8 characters starting from str[13] with '.'
memset(str + 13, '.', 8*sizeof(char));
printf("After memset(): %s", str);
return 0;
}
الناتج:
1
2
Before memset(): GeeksForGeeks is for programming geeks.
After memset(): GeeksForGeeks........programming geeks.
التوضيح: تشير (str + 13) إلى بداية الموضع الذي نريد تغيير قيمته. بعبارة أخرى، كتبنا في البداية str وهو بداية عنوان الجملة التي لدينا في الذاكرة عمومًا، ثم +13 أي نبدأ من أول حرف في الجملة وبعد 13 خانة (حرف) نبدأ بتغيير القيم للنقظة “.”، يستمر وضع النقط لثمان خانات فقط، ونلاحظ أن رقم ثمانية مضروب بحجم الـ char ولكن كون حجم الـ char هو 1 بايت فيبقى الرقم هو 8. وفي النهاية نحصل على الناتج أعلاه.
مثال آخر:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// C program to demonstrate working of memset()
#include <stdio.h>
#include <string.h>
void printArray(int arr[], int n)
{
for (int i=0; i<n; i++)
printf("%d ", arr[i]);
}
int main()
{
int n = 10;
int arr[n];
// Fill whole array with 0.
memset(arr, 0, n*sizeof(arr[0]));
printf("Array after memset()\n");
printArray(arr, n);
return 0;
}
الناتج
1
0 0 0 0 0 0 0 0 0 0
تمرين
قم بتخمين ناتج البرنامج التالي:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// C program to demonstrate working of memset()
#include <stdio.h>
#include <string.h>
void printArray(int arr[], int n)
{
for (int i=0; i<n; i++)
printf("%d ", arr[i]);
}
int main()
{
int n = 10;
int arr[n];
// Fill whole array with 10.
memset(arr, 10, n*sizeof(arr[0]));
printf("Array after memset()\n");
printArray(arr, n);
return 0;
}
لاحظ أن الكود أعلاه لا يضبط قيم المصفوفة على القيمة 10 وذلك ﻷن طريقة ضبط memset هو حرف حرف وأن ال integer يحوي أكثر من بايت واحد (حرف واحد) (حيث الـ integer هو 4 بايت في الذاكرة)
ولكن إذا استبدلنا رقم 10 بـ 1- فسنحصل على قيم 1- ﻷن تمثيل العدد 1- يحوي بالكامل على واحدات (1s) في كلا حالتي الـ char والـ int.
هذه المقالة مترجمة وبتصرّف. يرجى الاطلاع على المصدر