您好我在c中实现智能向量,并且我在重新分配缓冲区方面遇到了问题。
这是包含数组及其信息的结构:
struct _vector
{
item* vec;
size_t elements;
size_t size;
};
item只是一个typedef,在这种情况下碰巧是int。 我做了几个函数来管理数组,但应该调整它的那个,给我带来了问题。
(顺便说一句,Vector也是struct _vector *的typedef)
这是功能:
void insertVector(const Vector vec,const int pos,const item a)
{
if(vec->elements==vec->size)
{
item* temp=realloc(vec->vec,(vec->size*2)*sizeof(item));
if(temp==NULL)
{
puts("Error: space unavailable");
return;
}
//vec->vec=realloc(vec->vec,(vec->size*2)*sizeof(item));
vec->vec=temp;
vec->size*=2;
}
int size=vec->elements;
if(pos>=0&&pos<=size)
{
for(int i=size;i>pos;i--)
{
vec->vec[i]=vec->vec[i-1];
}
vec->vec[pos]=a;
vec->elements+=1;
printf("size is %lu\nelements are %lu\n",vec->size,vec->elements);
}
}
我只是移动内容为新元素腾出空间,它工作正常,问题是重新分配数组时。 当有效元素的数量等于数组的实际大小时, 我做一个realloc来加倍实际大小。 只要那个如果激活realloc就会使程序崩溃并出现此错误:释放对象的校验和不正确。
问题在于if,因为它只在大小和元素相等时崩溃,如果我注释掉那个部分,一切正常 我不知道它会是什么。
编辑: 我用来创建和初始化我正在使用的实例的函数是:
Vector newVector(void)
{
Vector new=malloc(sizeof(*new));
new->vec=NULL;
new->elements=0;
new->size=0;
return new;
}
和
void initVector(const Vector vec,const size_t size)
{
vec->vec=calloc(size,sizeof(item));
vec->elements=size;
vec->size=size*2;
}
答案 0 :(得分:0)
在initVector
功能中,您将错误的大小设置为使用calloc
分配的两倍。当您添加新元素时,此内存会被覆盖,这就是free
最终调用realloc
时失败的原因。将initVector
更改为:
void initVector(const Vector vec,const size_t size)
{
vec->vec=calloc(size,sizeof(item));
vec->elements=size;
vec->size=size;
}
答案 1 :(得分:0)
根据您的评论
我创建了一个新的矢量设置,将每个字段归零,然后我使用了这个函数:
void initVector(const Vector vec,const size_t size) { vec->vec=calloc(size,sizeof(item)); vec->elements=size; vec->size=size*2; }
我认为你正在错误地处理元素的大小和数量。该
initVector
函数只为vec->vec
数组分配内存,所以
vec->elements
应为0,而不是size
。 vec->size
应为size
,而不是size*2
// remove the const, you are modifying the data vec is pointing to
int initVector(Vector vec, size_t size)
{
if(vec == NULL)
return 0;
vec->vec = calloc(size, sizeof *vec->vec);
if(vec->vec == NULL)
return 0;
vec->elements = 0;
vec->size = size;
return 1;
}
。所以正确的功能应该是
insertVector
现在memmove
只会在所有已分配的空格时分配新空间
使用。
我建议您使用// again, remove the const here
int insertVector(Vector vec, const size_t pos, const item a)
{
if(vec == NULL)
return 0;
if(vec->elements==vec->size)
{
item* temp=realloc(vec->vec,(vec->size*2)*sizeof *temp);
if(temp==NULL)
{
fprintf(stderr, "Error: space unavailable\n");
return 0;
}
vec->vec=temp;
vec->size*=2;
}
// I use vec->elements as upper limit,
// otherwise you could have "holes" in the array and
// you wouldn't realize it.
if(pos < 0 || pos > vec->elements)
{
fprintf(stderr, "invalid position\n");
return 0;
}
memmove(vec->vec + pos + 1, vec->vec + pos, (vec->elements - pos) * sizeof *vec->vec);
vec->vec[pos] = a;
vec->elements += 1;
printf("size is %lu\nelements are %lu\n",vec->size,vec->elements);
return 1;
}
复制内存:
category