RealLOC: обращение к массиву указателя?
Вопрос
Я написал довольно простое (ish) реализацию стека, которая автоматически выращивает свой внутренний буфер массива, если это необходимо.
Для этого я бы естественно использовал Realloc. - Это работает, однако, все элементы массива заказываются назад после вызова Realloc ().
Код под вопросом:
- Заголовок: включить / pd / stack.h
- Источник: SRC / Stack / Stack.c.C
Этот пример будет вызвать указанное поведение:
#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()
фиксированный).