为什么这段代码导致无效指针?

时间:2016-07-30 12:09:51

标签: c function-pointers free

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

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

这是我的代码,我省略了所有评论和不相关的代码:

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);
}

1 个答案:

答案 0 :(得分:3)

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

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

应该是

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

(使用大写V)或

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

(带星号*)。