يشرح هذا الفصل الإدارة الديناميكية للذاكرة في C. توفر لغة البرمجة C وظائف عديدة لتخصيص الذاكرة وإدارتها. يمكن العثور على هذه الوظائف في ملف الرأس <stdlib.h> .
الأب رقم. | الوظيفة والوصف |
---|---|
1 | void *calloc(int num, int size); هذه وظيفة تخصص مجموعة من الأسطوانات عناصر كل منها في حجم بايت سيكون حجم . |
2 | void free(void *address); تقوم هذه الوظيفة بإصدار كتلة من كتلة الذاكرة المحددة بواسطة العنوان. |
3 | void *malloc(int num); هذه وظيفة تخصص مجموعة من الأسطوانات بايت وتركها غير مهيأة. |
4 | void *realloc(void *address, int newsize); تقوم هذه الوظيفة بإعادة تخصيص الذاكرة لتوسيعها حتى حجم الأخبار . |
تخصيص الذاكرة ديناميكيًا
أثناء البرمجة ، إذا كنت على دراية بحجم المصفوفة ، فهذا سهل ويمكنك تحديده كمصفوفة. على سبيل المثال ، لتخزين اسم أي شخص ، يمكن أن يصل إلى 100 حرف كحد أقصى ، بحيث يمكنك تحديد شيء ما على النحو التالي -
char name[100];
لكن دعنا الآن نفكر في موقف ليس لديك فيه فكرة عن طول النص الذي تريد تخزينه ، على سبيل المثال ، تريد تخزين وصف مفصل حول موضوع ما. نحتاج هنا إلى تحديد مؤشر للحرف دون تحديد مقدار الذاكرة المطلوبة وبعد ذلك ، بناءً على المتطلبات ، يمكننا تخصيص الذاكرة كما هو موضح في المثال أدناه -
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char name[100]; char *description; strcpy(name, "Zara Ali"); /* allocate memory dynamically */ description = malloc( 200 * sizeof(char) ); if( description == NULL ) { fprintf(stderr, "Error - unable to allocate required memory\n"); } else { strcpy( description, "Zara ali a DPS student in class 10th"); } printf("Name = %s\n", name ); printf("Description: %s\n", description ); }
عندما يتم تجميع التعليمات البرمجية أعلاه وتنفيذها ، فإنها تنتج النتيجة التالية.
Name = Zara Ali Description: Zara ali a DPS student in class 10th
يمكن كتابة نفس البرنامج باستخدام calloc () ؛ الشيء الوحيد الذي تحتاجه لاستبدال malloc بـ calloc على النحو التالي -
calloc(200, sizeof(char));
لذلك لديك سيطرة كاملة ويمكنك تمرير أي قيمة حجم أثناء تخصيص الذاكرة ، على عكس المصفوفات حيث بمجرد تحديد الحجم ، لا يمكنك تغييره.
تحجيم وتحرير الذاكرة
عندما يخرج البرنامج الخاص بك ، يقوم نظام التشغيل تلقائيًا بتحرير كل الذاكرة المخصصة بواسطة برنامجك ولكن كممارسة جيدة عندما لا تكون في حاجة إلى ذاكرة بعد الآن ، يجب عليك تحرير تلك الذاكرة عن طريق استدعاء الوظيفة مجانًا () .
بدلاً من ذلك ، يمكنك زيادة أو تقليل حجم كتلة الذاكرة المخصصة عن طريق استدعاء الوظيفة realloc () . دعونا نتحقق من البرنامج أعلاه مرة أخرى ونستفيد من وظائف realloc () و free () -
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char name[100]; char *description; strcpy(name, "Zara Ali"); /* allocate memory dynamically */ description = malloc( 30 * sizeof(char) ); if( description == NULL ) { fprintf(stderr, "Error - unable to allocate required memory\n"); } else { strcpy( description, "Zara ali a DPS student."); } /* suppose you want to store bigger description */ description = realloc( description, 100 * sizeof(char) ); if( description == NULL ) { fprintf(stderr, "Error - unable to allocate required memory\n"); } else { strcat( description, "She is in class 10th"); } printf("Name = %s\n", name ); printf("Description: %s\n", description ); /* release memory using free() function */ free(description); }
عندما يتم تجميع التعليمات البرمجية أعلاه وتنفيذها ، فإنها تنتج النتيجة التالية.
Name = Zara Ali Description: Zara ali a DPS student.She is in class 10th
يمكنك تجربة المثال أعلاه دون إعادة تخصيص ذاكرة إضافية ، وستعطي وظيفة strcat () خطأ بسبب نقص الذاكرة المتوفرة في الوصف.
تعليقات
إرسال تعليق