我正在实现自己的矢量类型,但是由于我不想始终将对函数(&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
,那么它可以正常工作,但是正如我所说我的目标是避免在调用函数时使用&
。