دالة realloc في لغة C
دالة ( realloc ) في السي وتعني re-allocaion, تعلَّمنا في دروس سابقة ماهي دالة sizeof() و كيف يتم الوصول إلى المصفوفة من خلال المؤشرات. و قد تتسائل أنا اعرف كيف اقوم بتعريف مصفوفة و تعيين القيم لها كما بالشكل
int array[3] = {1, 2, 3};
ثم نقوم بالوصول إلى جميع عناصر المصفوفة من خلال المربع, فلماذا التعقيد؟
لماذا اقوم بإستعمال المؤشرات ثم نصل إليه من خلال عمليات الجمع؟
سنرى الآن أن دالة malloc() تقوم بالوصول إلى المصفوفة من خلال المؤشر ,سوف نقوم الآن بالمثال بإنشاء مصفوفة متغيرة الحجم و الطلب من المستخدم إدخال السعة.
#include <stdio.h>
#include <stdlib.h>
{
printf("Enter the size of the array");
int s;
scanf("%d", &s);
int *array = (int *)malloc(s);
int *pointer = array;
for(int i = 0 ; i < s ; i++, array++)
{
*(array) = 20;
}
array = pointer;
for(int i = 0 ; i < s ; i++, array++)
{
printf("--%d", *array);
}
array = pointer;
free(array);
return 0;
}
قُمنا بإظهار رسالة للمستخدم نُطالبهُ بإدخال حجم المصفوفة و قُمنا بإنشاء مُتغير int هو s. و بواسطة دالة scanf لكي يقوم المستخدم في إدخال الرقم ثم وضعنا &s و لا ننسى علامة & لكي لا تحدث مشاكل في البرنامج. و قُمنا بتعريف مصفوفة على أنها مؤشر وضعنا قبلها النجمة و قٌُمنا بإستعمال دالة malloc لوضع الحجم لهذه المصفوفة. وفي القوسين وضعنا s التي ادخلها المُستخدم.
و الدالة malloc تقوم بإرجاع قيمة pointer من نوع void لذا سوف نقوم بتحويلها إلى نوع المؤشر array و نوع المؤشر الخاص به هو int. ووضعنا قبل الدالة قوسين ووضعنا بهم نوع المؤشر int ثم نجمة. بعد ذلك قُمنا بتغيير القيم في هذه المصفوفة عبر حلقة for تكرارية و تبدأ من i = 0 إلى i < s أي اصغر من الحجم الذي ادخله المُستخدم. و نحن نريد تغيير قيم المؤشر وضعنا نجمة ثم فتحنا قوسين وضعنا بها إسم المصفوفة و كتبنا يساوي 20 أي في كل عناصر هذه المصفوفة تكون 20.
بعدها قُمنا بطباعة ما سبق أي يطبع لنا رقم 20 بنفس العدد الذي يُدخله المستخدم كحجم للمصفوفة. و في النهاية قُمنا بتحرير المساحة التي قُمنا بحجزها عبر free و إسم المؤشر و عند تشغيل البرنامج ستكون بالشكل.
Enter the size of the array : 10
--20--20--20--20--20--20--20--20--20--20
نُلاحظ أنه طَبَعَ لنا الرقم 20 عشر مرات بنفس العدد الذي أدخلناه له كحجم للمصفوفة.
عند إدخال الرقم 7.
Enter the size of the array : 10
--20--20--20--20--20--20--20
سوف نتعرَّف على دالة مفيدة في مجال المؤشرات و هي realloc و تُستخدَم لتغيير سعة ذاكرة محجوزة مسبقاً. فهي تأخذ مؤشر ذاكرة محجوزة مسبقاً بإستخدام malloc بالإضافة إلى السعة الجديدة من نوع int. وتقوم بإرجاع عنوان الذاكرة المحجوز الجديد, عِلماً أن البيانات التي كانت في المكان القديم سيتم نقلها للمكان الجديد. يُمكن إستخدامها لتعديل سعة ذاكرة محجوزة و ذلك بدلاً من إلغاء الحجز بإستخدام free و إعادة حجزها بإستخدام دالة malloc بشكل يدوي بحجم آخر.
عند إستدعاء دالة realloc و تمرير المؤشر الذي يُشير إلى مكان الحجز القديم بالإضافة إلى السعة الجديدة. فسيتم اولاً حجز مكان جديد بنفس هذه السعة و نقل كل القيم من المكان القديم إليها إن اتسعت. بعد ذلك يتم الغاء المكان القديم حتى يتمكَّن نظام التشغيل الإستفادة منه في أُمور اخرى. و من الجدير بالذكر أن السعه الجديدة لا يُمكن أن تكون اكبر من المحجوزة مسبقاً, فيمكن أن تكون أقل منها.