首页 > 解决方案 > 使用无效指针的动态数组进行错误重新分配

问题描述

我正在尝试基于动态数组创建动态集抽象数据类型。但是,当数组已满并调用 realloc 时,编译器会出错,它们是: realloc(): invalid next size 我的代码如下:

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);
    }

}

标签: cdynamicstackrealloc

解决方案


目前尚不清楚您是否需要void**void*.

这条线是有问题的:stack->array= malloc(stack->capacity*size_data_type);

您永远不会正确初始化此内存区域。void*它应该为尽可能多的对象分配空间。这与指向项目的数据大小无关。每个这样的指针都需要初始化。您需要跟踪指针的总数以及每个指向项目的大小。

或者,如果这意味着指向一维数组或单个对象,您应该放弃void**支持。void*

stack->array[++stack->top]=data;看起来很可疑,这会使索引 0 未初始化。

确保包含stdlib.h,否则你会在石器时代的 C90 编译器上遇到严重的错误,你的演员隐藏的错误。


推荐阅读