سؤال

int main ()
{
    int * b;
    b = (int*) malloc (1);
    *b=110000;
    free (b);
    return 0;
}

لماذا يحدث فساد الكومة في free (b);?

IMO ، يحدث فساد الكومة بالفعل في *b=110000;.

هل كانت مفيدة؟

المحلول

malloc()حجة هي عدد البايتات لتخصيصها. تحتاج إلى استخدام:

b = (int*) malloc(sizeof(int));

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

نصائح أخرى

إنه في *B = 110000 ؛ نظرًا لأنك تقوم بتخصيص الذاكرة لبايت واحد ، ثم تخصيص int في أكثر من بايت واحد. إما أنه يمكنك الحصول على B = (int *) malloc (sizeof (int)) أو بدلاً من int *b يمكنك الحصول على char *b ثم يلقي مؤشر malloced إلى char *. قد يعمل الرمز حتى إذا قمت بتعيين قيمة أقل من 128 (بسبب موقع char الموقّع) إلى *ب.

تحرير:- أعتقد في بعض الأحيان حتى أن هذا سيعمل دون أي متاعب. نظرًا لأن المترجم قد يختار تخصيص أكثر من بايت من الذاكرة للوصول السريع للبيانات.

يحدث فساد الكومة بالفعل في *b=11000 المهمة ، ولكن لم يتم الكشف عنها حتى free(b) اتصل لأن هذه هي النقطة الأولى التي يتم فيها فحص سلامة الكومة مرة أخرى.

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

يكتب الرمز بيانات أكثر إلى كتلة الذاكرة أكثر من المساحة المتاحة لها وبالتالي إفساد بداية كتلة الذاكرة صالحة التالية.

باستخدام char * بدلاً من int * وكتابة قيمة -128 إلى 127 إلى * B يجب إصلاحها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top