【问题标题】:Error realloc with Dynamic Array of Void Pointers使用无效指针的动态数组进行错误重新分配
【发布时间】:2019-08-29 17:05:31
【问题描述】:

我正在尝试基于动态数组创建动态集合抽象数据类型。但是,当数组已满并调用 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);
    }

}

【问题讨论】:

  • 你能告诉我们isFull()函数以及你如何使用这个函数吗?另外printf("%d pushed to stack\n", data); 应该给你一个警告wrong format specifier
  • 您需要发布minimal reproducible example。由于这些错误,堆通常会被其他代码覆盖,因此您应该发布一种简单的方法来重现它(包括您调用的所有函数,如 @mch 所写)。
  • struct arraystack *tmp=createStack(5,sizeof(int)); 应该是struct arraystack *tmp=createStack(5,sizeof(void*));
  • 抱歉打错了现在是正确的!!
  • 我不知道,@mch。相反,我认为createStack() 应该做stack-&gt;array= malloc(stack-&gt;capacity * sizeof(void *));。这样struct arraystackdata_size 成员可能对某些事情有用。

标签: c dynamic stack realloc


【解决方案1】:

不清楚你需要void**还是void*

这行有问题:stack-&gt;array= malloc(stack-&gt;capacity*size_data_type);

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

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

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

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

【讨论】:

    猜你喜欢
    • 2015-07-28
    • 2014-03-10
    • 1970-01-01
    • 2013-01-29
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多