realloc的问题,使程序崩溃

时间:2018-04-03 20:40:45

标签: c arrays realloc

您好我在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;
}

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,而不是sizevec->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