سؤال

لقد كتبت بسيطة بدلا من ذلك(العش) مكدس التنفيذ التي من شأنها أن تنمو تلقائيا الداخلية مجموعة العازلة إذا لزم الأمر.

لذلك كنت بطبيعة الحال استخدام realloc - يعمل ولكن جميع عناصر مجموعة يتم ترتيب عكسي بعد realloc() المكالمة.

الرمز في السؤال:

هذا المثال سوف يؤدي وقال السلوك:

#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() ثابت).

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