c - 使用无效指针的动态数组进行错误重新分配
问题描述
我正在尝试基于动态数组创建动态集抽象数据类型。但是,当数组已满并调用 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 编译器上遇到严重的错误,你的演员隐藏的错误。
推荐阅读
- javascript - 确定圆上的所有点#Javascript
- c++ - Caesar Cipher 无法在 C++ 中正确解密的问题
- amazon-web-services - 如何在每次启动时启动容器?
- firebase - 如何从 Firebase Analytics 获取 BigQuery 中的性别和年龄?
- java - 关闭投影不会在 Spring Boot 中给出本机查询的结果
- reflection - C# 从引用的库中获取所有类型
- java - 存储的drawable在Android中发生了变化
- clojure - 如何使用 lein exec 要求 clojure.java.io?
- python-3.x - IDLE 中的光标位置
- c++ - 提示用户输入一个单词,然后检查它是否有双字符