【发布时间】: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->array= malloc(stack->capacity * sizeof(void *));。这样struct arraystack的data_size成员可能对某些事情有用。