البرمجة

تحسين استخدام الذاكرة في C

يبدو أن لديك برنامج تحتاج إلى تصحيحه لحل مشكلة تعطله عند التشغيل. البرنامج يحاول إنشاء قائمة متسلسلة من الأشخاص (persons) باستخدام الذاكرة المخصصة (malloc)، ومن ثم يعرض اسماءهم وأعمارهم.

المشكلة الرئيسية في البرنامج تكمن في دالة “insert”، حيث لم تعيد قيمة بعد الإنشاء (allocation)، مما يؤدي إلى فقدان الوصول إلى الأشخاص (persons) الذين تم إنشاؤهم. بالإضافة إلى ذلك، لا يتم تعيين العنصر “next” في الهيكل إلى أي شيء، مما يؤدي إلى عدم ربط العناصر مع بعضها البعض.

بالنظر إلى ذلك، يجب عليك تعديل الدالة “insert” لتعيد القيمة المناسبة، وتقوم بتعيين العنصر “next” بشكل صحيح. بالإضافة إلى ذلك، ينبغي التأكد من أن الذاكرة المخصصة تحرر بعد الانتهاء من استخدامها لتجنب تسرب الذاكرة.

إليك إصلاح للبرنامج:

c
#include #include #include #define HOW_MANY 7 char *names[HOW_MANY]= {"Simon", "Suzie", "Alfred", "Chip", "John", "Tim", "Harriet"}; int ages[HOW_MANY]= {22, 24, 106, 6, 18, 32, 24}; struct person { char name[40]; unsigned int age; struct person *next; }; struct person* insert(struct person *people[], char *name, int age) { struct person *ptr; ptr = (struct person *)malloc(sizeof(struct person)); if(ptr == NULL) { printf("Memory allocation failed\n"); return NULL; } strcpy(ptr->name, name); ptr->age = age; ptr->next = NULL; return ptr; } int main() { struct person *people[HOW_MANY]; struct person *current = NULL; for (int i = 0; i < HOW_MANY; i++) { people[i] = insert(people, names[i], ages[i]); if (i > 0) { current->next = people[i]; } current = people[i]; } for(int i = 0; i < HOW_MANY; i++) { printf("%s %d\n", people[i]->name, people[i]->age); } // Free allocated memory for (int i = 0; i < HOW_MANY; i++) { free(people[i]); } return 0; }

هذا الإصلاح يعيد القيمة المناسبة من دالة “insert” ويضبط العنصر “next” بشكل صحيح. كما يتم تحرير الذاكرة المخصصة بعد الانتهاء من استخدامها في الدالة الرئيسية. باستخدام هذه التغييرات، ينبغي على البرنامج الآن أن يعمل بشكل صحيح دون أي أخطاء تشغيل.

المزيد من المعلومات

بالطبع، ها هي إكمال للمقال:

عند تصحيح البرنامج، يجب أن نأخذ في الاعتبار عدة نقاط أساسية تتعلق بتنفيذ الذاكرة المخصصة وإدارة الهياكل في لغة البرمجة C.

أولاً وقبل كل شيء، يجب التأكد من تضمين المكتبات اللازمة لاستخدام الدوال المعرفة مسبقًا مثل “malloc” و “free” و “strcpy”. ثم يجب التأكد من تعريف هيكل البيانات بشكل صحيح، بما في ذلك تعريف أي عناصر إضافية مثل “next” في هذه الحالة.

عند استخدام الذاكرة المخصصة باستخدام “malloc”، يجب دائمًا التحقق من نجاح عملية التخصيص عن طريق التحقق من قيمة المؤشر المُرجَع (“ptr” في هذه الحالة). في حال فشل التخصيص، يجب التعامل مع هذا الخطأ بشكل مناسب، سواء عبر عرض رسالة خطأ أو إيقاف التنفيذ بشكل آمن.

ثم، يجب على البرنامج العمل على تعيين القيم المناسبة لكل عنصر في الهيكل بعد تخصيص الذاكرة له. هذا يشمل نسخ السلاسل (strings) باستخدام “strcpy” بدلاً من السماح بالتعامل المباشر مع عناوين الذاكرة.

بعد ذلك، عند تشغيل البرنامج الذي يستخدم الذاكرة المخصصة، يجب التأكد من تحرير هذه الذاكرة بشكل صحيح بعد الانتهاء من استخدامها. في البرنامج المعدل، تمت عملية تحرير الذاكرة المخصصة في الدالة الرئيسية باستخدام “free” بعد الانتهاء من استخدام الأشخاص (persons) المنشأين.

أخيرًا، يجب دائمًا الاحتراس من التحكم في الحلقات التي تستخدم الذاكرة المخصصة، لتجنب أي تسريب ذاكرة أو وصول غير صحيح. في البرنامج المعدل، تمت معالجة هذا الأمر من خلال تعيين العنصر “next” بشكل صحيح للربط بين الأشخاص المنشأين.

باستخدام هذه المبادئ وتطبيقها بعناية، يمكن تجنب الأخطاء الشائعة المتعلقة بالتعامل مع الذاكرة المخصصة في البرامج المكتوبة بلغة C، وضمان أداء برامج أكثر استقرارًا وأمانًا.

مقالات ذات صلة

زر الذهاب إلى الأعلى

هذا المحتوى محمي من النسخ لمشاركته يرجى استعمال أزرار المشاركة السريعة أو تسخ الرابط !!