为什么此代码会导致无效指针?
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));
(带星号 *
)。
我有 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));
(带星号 *
)。