为什么此代码会导致无效指针?

Why is this code causing invalid pointer?

我有 C++ 背景并且是 C 的新手。我想用 C 编写一个通用向量。一切都很好,直到我决定添加一个自由函数来删除每个元素。但是现在 运行 free()vectorFree() 中运行时程序会崩溃。

我还没有测试 free 函数,我只是传递 NULL 并且 vector 已经不能工作了。在我添加自由函数功能之前,向量运行良好。

这是我的代码,我省略了所有注释和无关代码:

vector.h

typedef void (*FreeFunction)(void *element);

typedef struct Vector {
    void *elements;
    ...
    FreeFunction freeFunc;
} Vector;

Vector* vectorAlloc(size_t elemSize, VectorFreeFunction freeFunc);
void vectorFree(Vector *vector);

...

vector.c

Vector* vectorAlloc(size_t elemSize, VectorFreeFunction freeFunc)
{
    Vector* vector = malloc(sizeof(vector));
    ...

    vector->elements = malloc(elemSize * vector->capacity);
    ...

    vector->freeFunc = freeFunc;
    return vector;
}

void vectorFree(Vector *vector)
{
    if (vector->freeFunc != NULL) {
        for (int i = 0; i < vector->size; i++) {
            vector->freeFunc(vectorAt(vector, i));
        }
    }

    free(vector->elements);
    free(vector);
}

...

vectorTest.cpp

void test()
{
    Vector* num = vectorAlloc(sizeof(int), NULL);
    vectorFree(num);
}

这一行有问题,因为它没有分配足够的内存:

Vector* vector = malloc(sizeof(vector));

应该是

Vector* vector = malloc(sizeof(Vector));

(大写V)或

Vector* vector = malloc(sizeof(*vector));

(带星号 *)。