在C中实现向量类型

时间:2018-09-09 10:14:08

标签: c

我正在实现自己的矢量类型,但是由于我不想始终将对函数(&v)的引用传递给我,因此我尝试定义指向矢量结构的指针类型。我只是有以下代码会引发细分错误:

typedef struct vector {
    void **items;
    unsigned int capacity;
    unsigned int size;
} vector_st;

typedef vector_st * vector_t;

void vector_init(vector_t v, unsigned int capacity)
{
    v = (vector_t)calloc(1, sizeof(vector_st)); // even using this throws segmentation fault;
    v->capacity = capacity;
    v->size = 0;
    v->items = malloc(sizeof(void *) * v->capacity);
    if (v->items == NULL) {
        exit(EXIT_FAILURE);
    }
}

static void vector_resize(vector_t v, unsigned int capacity)
{
    void **items = realloc(v->items, sizeof(void *) * capacity);
    if (items) {
        v->items = items;
        v->capacity = capacity;
    } else {
        exit(EXIT_FAILURE);
    }
}

void vector_add(vector_t v, void *item)
{
    if (v->capacity == v->size) {
        vector_resize(v, v->capacity * 2);
    }
    v->items[v->size++] = item;
}

unsigned int vector_capacity(vector_t v)
{
    return v->capacity;
}

unsigned int vector_size(vector_t v)
{
    return v->size;
}

void vector_free(vector_t v)
{
    if (v) {
        free(v->items);
        v = NULL;
    }
}

int main()
{
    vector_t v;
    vector_init(v, 4);

    vector_add(v, "Hello");
    vector_add(v, "from");
    vector_add(v, "the");
    vector_add(v, "hole");

    printf("Vector capacity: %u\n", vector_capacity(v));
    printf("Vector size: %u\n", vector_size(v));

    vector_free(v);
    return 0;
}

我知道这是一个普遍的问题,但是我似乎无法弄清楚发生内存错误的地方,即使我在calloc函数中调用vector_init也会发生分段错误再次。

如果我只是将类型定义为typedef vector_st vector_t,即不将其定义为指针类型,然后将函数定义为接受指针,然后将引用传递为&v,那么它可以正常工作,但是正如我所说我的目标是避免在调用函数时使用&

0 个答案:

没有答案