recent
أخبار ساخنة

دالة realloc في لغة السي C الدرس|23|

الصفحة الرئيسية


دالة realloc في لغة C

تعلَّمنا في دروس سابقة ماهي دالة sizeof و كيف يتم الوصول إلى المصفوفة من خلال المؤشرات, و قد تتسائل أنا اعرف كيف اقوم بتعريف مصفوفة و تعيين القيم لها كما بالشكل

int array[3] = {1, 2, 3};


ثم نقوم بالوصول إلى جميع عناصر المصفوفة من خلال المربع, فلماذا التعقيد؟ لماذا اقوم بإستعمال المؤشرات ثم نصل إليه من خلال عمليات الجمع؟
سنرى الآن أن دالة malloc تقوم بالوصول إلى المصفوفة من خلال المؤشر ,سوف نقوم الآن بالمثال بإنشاء مصفوفة متغيرة الحجم و الطلب من المستخدم إدخال السعة.

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
    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 و إسم المؤشر و عند تشغيل البرنامج ستكون بالشكل.

عند إدخال رقم 10.


نُلاحظ أنه طَبَعَ لنا الرقم 20 عشر مرات بنفس العدد الذي أدخلناه له كحجم للمصفوفة.

عند إدخال الرقم 7.


سوف نتعرَّف على دالة مفيدة في مجال المؤشرات و هي realloc و تُستخدَم لتغيير سعة ذاكرة محجوزة مسبقاً, فهي تأخذ مؤشر ذاكرة محجوزة مسبقاً بإستخدام malloc بالإضافة إلى السعة الجديدة من نوع int و تقوم بإرجاع عنوان الذاكرة المحجوز الجديد, عِلماً أن البيانات التي كانت في المكان القديم سيتم نقلها للمكان الجديد.

يُمكن إستخدامها لتعديل سعة ذاكرة محجوزة و ذلك بدلاً من إلغاء الحجز بإستخدام free و إعادة حجزها بإستخدام دالة malloc بشكل يدوي بحجم آخر.

عند إستدعاء دالة realloc و تمرير المؤشر الذي يُشير إلى مكان الحجز القديم بالإضافة إلى السعة الجديدة, فسيتم اولاً حجز مكان جديد بنفس هذه السعة و نقل كل القيم من المكان القديم إليها إن اتسعت بعد ذلك يتم الغاء المكان القديم حتى يتمكَّن نظام التشغيل الإستفادة منه في أُمور اخرى, و من الجدير بالذكر أن السعه الجديدة لا يُمكن أن تكون اكبر من المحجوزة مسبقاً, فيمكن أن تكون أقل منها.

إضغط هنا لقراءة الدرس السابق

google-playkhamsatmostaqltradent