重新分配数组会导致“已中止”错误

时间:2016-11-20 10:56:37

标签: c arrays vector struct

我为矢量编写了以下结构:

typedef struct Vector_ Vector;

struct Vector_
{
    int dim;
    double* vector;
};

我写了一个函数来初始化该结构的一个新实例:

Vector* newVector(int length){
    int i = 0;
    Vector* vec = malloc(sizeof(Vector));
    assert(vec != NULL);
    assert(length > 0);


    vec->dim = length;
    vec->vector = malloc((length+1)*sizeof(double));
    assert(vec->vector != NULL);
    for(i=0;i<=length+1;i++) vec->vector[i] = 0;
    return vec;
}

这一切都有效,但后来我编写了一个函数来重新分配内存并改变向量的长度,如下所示:

Vector* setVectorLength(Vector* vec, int length)
{
    assert(vec->dim > 0);
    int i = 0;
    if(length > vec->dim)
    {
        vec->vector = realloc(vec->vector,(length+1)*sizeof(double));
        assert(vec->vector != NULL);
        for(i = vec->dim+1;i<=length;i++)
        {
            vec->vector[i] = 0;
        }
    }
    else
    {
        vec->vector = realloc(vec->vector,length+1 * sizeof(double));
    }
    vec->dim = length;
    return vec;
}

我称之为:

int main()
{
    Vector* newvec = newVector(5);
    setVectorLength(newvec,8);
}

由于某种原因,我重新分配向量数组内存的setVectorLength函数中的行会导致程序中止。如果我评论该部分,一切正常。有趣的是,我能够向数组写入条目,即使没有将其重新分配到足够高的长度,例如,如果我只初始化向量结构并给它长度为5,那么我可以将值写入第7或第8点vec-&gt;矢量数组,即使我从来没有为它分配过多的内存。任何提示?

0 个答案:

没有答案