بعد تحرير ذاكرة المؤشر، يمكنني إعادة تعيين القيمة

StackOverflow https://stackoverflow.com//questions/22064341

  •  23-12-2019
  •  | 
  •  

سؤال

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

أولاً أقوم بتخصيص 20 بايت لـ ptr.أقوم بنسخ سلسلة جديدة إلى ptr.ثم أقوم بتحرير ptr ثم طباعة ptr وهو يعمل بدون أي pblm.أخيرًا قمت بإعادة تعيين سلسلة أخرى أتوقع أنها قد تؤدي هذه المرة إلى إنشاء تفريغ أساسي.لكنني لم أحصل على أي تفريغ أساسي.هل يمكن لأي شخص أن يشرح سبب عدم إنشاء تفريغ أساسي.

int main()
{
   char *ptr;
   ptr =(char*)  malloc (20);
   strcpy(ptr,"MemoryOperations");
   printf("Before Free memory : %s\n",ptr);
   free(ptr);
   printf("After Free memory : %s\n",ptr);
   strcpy(ptr,"MemReassign");
   printf("After Re Assigning : %s\n",ptr);
   return 0;
}

نفس الكود الذي أقوم بتشغيله باستخدام dbx،

(dbx) check -all
access checking - ON
memuse checking - ON
(dbx) run
Running: a.out 
(process id 19081)
RTC: Enabling Error Checking...
RTC: Running program...
Before Free memory : MemoryOperations
Read from unallocated (rua):
Attempting to read 1 byte at address 0x100101a48
which is 2232 bytes into the heap; no blocks allocated
stopped in _ndoprnt at 0xffffffff671abbf0
0xffffffff671abbf0: _ndoprnt+0x1c04:    call     _PROCEDURE_LINKAGE_TABLE_+0x620 [PLT] ! 0xffffffff67340d20
(dbx) exit
هل كانت مفيدة؟

المحلول

مجاني (PTR) لا يعدل قيمة PTR.انها مجرد علامات أن الموقع المقابل متاح لإعادة تخصيص.

giveacodicetagpre.

وبالتالي إذا كنت ترغب بالفعل في إنشاء تفريغ أساسي، جرب شيئا متأكدا النار ثم جرب شيئا مجنونا، مثل:

giveacodicetagpre.

نصائح أخرى

إذا قمت بالكتابة في الذاكرة بعد تحريرها، يمكن أن يحدث أي شيء.إنه سلوك غير محدد.يمكنك الحصول على تفريغ الأساسية أم لا.في حالتك، لن تحصل على تفريغ أساسي لأن الذاكرة، حتى لو تم تحريرها، لا يزال من الممكن الوصول إليها من خلال العملية الخاصة بك.بوف إذا كنت ستفعل آخر malloc قبل return 0 البيان والكتابة في تلك الذاكرة، فمن المرجح أن تتم الكتابة فوق السلسلة "بعد إعادة التعيين ...".

مع دي بي اكس، printf("After Free memory : %s\n",ptr); ينتج عن العبارة خطأ "القراءة من غير المخصص" لأنك قمت بتشغيل فحص الوصول، ولكن بدون dbx لا يوجد فحص وصول على الإطلاق.

لمحاكاة التفريغ الأساسي يمكنك القيام بذلك:

void main()
{
  char *p = NULL ;
  *p = 'A' ;
}

سوف يتعطل هذا على معظم المنصات.

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