سؤال
لقد كتبت بسيطة بدلا من ذلك(العش) مكدس التنفيذ التي من شأنها أن تنمو تلقائيا الداخلية مجموعة العازلة إذا لزم الأمر.
لذلك كنت بطبيعة الحال استخدام realloc - يعمل ولكن جميع عناصر مجموعة يتم ترتيب عكسي بعد realloc() المكالمة.
الرمز في السؤال:
- الرأس: تشمل/pd/المكدس.ح
- المصدر: src/المكدس/المكدس.ج
هذا المثال سوف يؤدي وقال السلوك:
#include "pd/strlib.h"
#include "pd/stack.h"
#include "pd/memory.h"
#include <stdlib.h>
#include <stdio.h>
int main()
{
int index = 0;
char* buffer;
pd_stack_t* stc = pd_stack_new();
pd_stack_push(stc, "blue");
pd_stack_push(stc, "green");
pd_stack_push(stc, "red");
pd_stack_push(stc, "yellow");
pd_stack_push(stc, "pink");
pd_stack_push(stc, "olive");
pd_stack_push(stc, "beige");
pd_stack_push(stc, "gold");
pd_stack_push(stc, "grey");
pd_stack_push(stc, "lime");
pd_stack_push(stc, "khaki");
while((index++) != 500)
{
pd_stack_push(stc, "__random_value__");
}
buffer = (char*)malloc(pd_stack_size(stc));
pd_stack_dump_tomem(stc, buffer, 1);
fprintf(stdout, "%s", buffer);
return 0;
}
أنا حقا جاهل عن هذا.مساعدة من فضلك!
المحلول
يبدو pd_stack_dump_tomem يبدأ المؤشر في stack size
و الانقاص إلى 0 إلحاق العناصر في ترتيب عكسي.
تغيير تبدأ من 0 و أعاد إلى stack size
(يبدو realloc
هي لا علاقة لها)
نصائح أخرى
لديك بعض المشكلات الأساسية في رمز المكدس ، لذلك لا أعتقد realloc()
هي مشكلتك. فيما يلي بعض الأشياء التي يجب أن تبحث عنها وعنوانها:
يُشار إلى العنصر العلوي على المكدس (عندما لا يكون فارغًا)
(gct->stackcount - 1)
, ، منذ ذلك الحين فيpd_stack_push()
تقوم بتخزين عنصر جديد فيgct->ptr_stack[gct->stackcount]
ثم الزيادةstackcount
. ومع ذلك ، عند الوصول إلى العنصر العلوي ، يمكنك استخدام الإزاحة غير الصحيحة ،gct->ptr_stack[gct->stackcount]
بدلاً منgct->ptr_stack[gct->stackcount - 1]
. على وجه الخصوص ، فيpd_stack_pop()
, ، يمكنك تحرير هذا العنصر الذي قد يفسد الكومة لأنه لا يوجد مؤشر صحيح في موقع المكدس هذا.في
pd_stack_push()
أنت أتصلrealloc()
في كل مرة يتم فيها دفع عنصر جديد إلى المكدس. لن يفسد هذا بالضرورة أي شيء أو يسبب عيبًا ، لكنه غير ضروري - خاصة وأنك تطلب دائمًا نفس الحجم. بمعنى آخر ،realloc()
يجب أن تكون المكالمات NOPs باستثناء الأول.pd_stack_pop_index()
ليس من المنطقي حتى ما لم تقم فقط ببشر العنصر العلوي (في هذه الحالةpd_stack_pop()
يجب استخدامها). يمكنك تحرير شيء يحتمل أن يكون في منتصف المكدس ، ثم تقليلstackcount
, ، في الأساس جعل العنصر الأعلى (وهو ما لا يمكن الوصول إليه بالضرورة ما قمت بتحريره). سيتم الآن الوصول إلى العنصر الموجود في منتصف المكدس الذي تم إطلاقه مرة أخرى عندما يتم عرضه (على افتراض ذلكpd_stack_pop()
ثابت).