Перераспределение ошибок с помощью динамического массива указателей пустот - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь создать динамический набор абстрактных типов данных на основе динамического массива.Тем не менее, я получаю компилятор ошибку, когда массив заполнен, и я вызываю realloc, а именно: realloc (): неверный следующий размер Мой код выглядит следующим образом:

struct arraystack{
    int top;
    int capacity;
    void **array;
    size_t data_size; //size of my data type
};

struct arraystack * createStack(int capacity,size_t size_data_type){
    struct arraystack *stack= (struct arraystack*) malloc(sizeof(struct arraystack));
    stack->capacity=capacity;
    stack->top=-1;
    stack->data_size=size_data_type;
    stack->array= malloc(stack->capacity*size_data_type);
    return stack;  
}

void push(struct arraystack *stack, void* data){
     if(isFull(stack)){
         printf("Invoco realloc\n");
         stack->capacity=(stack->capacity*2)+1;
         void **tmp=realloc(stack->array,(stack->capacity*stack->data_size)); //this line gives me an error
         if(!tmp){
             printf("Attenzione memoria insufficente!\n");
             exit(1);
         }
         stack->array=tmp;
     }
     stack->array[++stack->top]=data;
     printf("%d pushed to stack\n", data); 
}

int isFull(struct arraystack *stack){
    return stack->top == stack->capacity - 1; 
}

int main(){
    struct arraystack *tmp=createStack(5,sizeof(int));

    int i;
    for(i=0;i<=20;i++){
        push(tmp,i);
        printf("top-> %d memoria allocata->%d\n",tmp->top,tmp->capacity);
    }

}

1 Ответ

0 голосов
/ 08 апреля 2019

Не ясно, нужно ли вам void** или void*.

Эта строка проблематична: stack->array= malloc(stack->capacity*size_data_type);

Вы никогда не инициализируете эту область памяти правильно.Он должен выделить место для столько void*, сколько у вас есть объектов.Это не имеет никакого отношения к размеру данных указанных элементов.Каждый такой указатель должен быть инициализирован.Вам необходимо отслеживать общее количество указателей, а также размер каждого указанного элемента.

В качестве альтернативы вам следует сбросить void** в пользу void*, если предполагается, что он указывает наодномерный массив или отдельный объект.

stack->array[++stack->top]=data; выглядит подозрительно, это оставляет индекс 0 неинициализированным.

Не забудьте включить stdlib.h, иначе вы получите серьезные ошибки на каменном веке C90компиляторы, ошибки, которые скрывают ваши приведения.

...