Вопрос

Я написал довольно простое (ish) реализацию стека, которая автоматически выращивает свой внутренний буфер массива, если это необходимо.

Для этого я бы естественно использовал 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