البرمجة

تفادي أخطاء تحرير الذاكرة في لغة C

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

أولاً وقبل كل شيء، يُشير الخطأ إلى أن الذاكرة التي تم تحريرها باستخدام free() لم تكن قد تم تخصيصها بواسطة malloc() بشكل صحيح. يعود السبب في ذلك إلى الخطأ في التعامل مع المصفوفة.

في الشيفرة، تقوم بتخصيص مساحة في الذاكرة باستخدام malloc():

c
char* in = (char *)malloc(sizeof(char)*100);

ثم تعين قيمة نص على هذه المساحة باستخدام التعبير:

c
in = "Sort of Input String with LITERALS AND NUMBERS\0";

هنا يكمن الخطأ. عندما تقوم بتعيين النص، فإنك تجعل المؤشر in يشير إلى موقع النص في الذاكرة وليس إلى المساحة التي تم تخصيصها باستخدام malloc()، وبالتالي، عند استخدام free() لتحرير الذاكرة، يحدث الخطأ.

لتصحيح ذلك، يجب عليك استخدام دالة strcpy() لنسخ النص إلى المساحة المخصصة بواسطة malloc() بدلاً من تعيين المؤشر مباشرة:

c
char* in = (char *)malloc(sizeof(char)*100); strcpy(in, "Sort of Input String with LITERALS AND NUMBERS");

بهذه الطريقة، سيتم نسخ النص إلى المساحة التي تم تخصيصها، وستكون العملية صحيحة عند استخدام free() لتحرير الذاكرة.

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

بالتأكيد، دعونا نقوم بتوسيع المعلومات حول الموضوع. في لغة البرمجة C، يُستخدم مصطلح “التخصيص الدينامي” للإشارة إلى عملية حجز وتحرير الذاكرة أثناء تنفيذ البرنامج. الدوال malloc() و free() هي جزء من مكتبة standard library في C وتستخدم لإدارة الذاكرة الدينامية.

عندما تستخدم malloc()، يتم تخصيص مساحة من الذاكرة بحجم معين ويُعيد المؤشر إلى بداية هذه المساحة. في حالتك، كان حجم المساحة هو sizeof(char) * 100. ومن ثم، يمكنك استخدام هذا المؤشر لتخزين معلومات.

ومع ذلك، عند تعيين القيمة للمؤشر in باستخدام in = "Sort of Input String with LITERALS AND NUMBERS\0";، فإنك في الواقع تجعل المؤشر يشير إلى مكان آخر في الذاكرة حيث تم تخزين النص (الذي هو ثابت ولا يمكن تغييره)، وليس المساحة التي تم تخصيصها باستخدام malloc().

عند استخدام free()، يتوجب عليك تحرير المساحة التي تم تخصيصها باستخدام malloc()، وليس تلك التي تم تخزين النص فيها مباشرة. لذا، من الأهمية بمكان استخدام دوال مثل strcpy() لنسخ النصوص في المساحات المخصصة.

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

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

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

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