gpt4 book ai didi

c - 使用动态空指针数组进行重新分配时出错

转载 作者:行者123 更新时间:2023-11-30 16:19:39 25 4
gpt4 key购买 nike

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

}

最佳答案

尚不清楚您是否需要 void** 还是 void*

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

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

或者,如果这意味着指向一维数组或单个对象,则应该放弃 void** 而使用 void*

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

确保包含 stdlib.h ,否则您将在石器时代 C90 编译器上遇到严重的错误,这些错误会被您的转换隐藏。

关于c - 使用动态空指针数组进行重新分配时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55575279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com