القائمة الرئيسية

الصفحات

C - Memory Management / إدارة الذاكرة

 يشرح هذا الفصل الإدارة الديناميكية للذاكرة في 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 () خطأ بسبب نقص الذاكرة المتوفرة في الوصف. 

الصفحة التالية                                                                              الصفحة السابقة   
هل اعجبك الموضوع :

تعليقات