c - 释放由 malloc 分配的结构的结构会导致错误?

标签 c memory-management struct malloc free

所以我正在尝试使用 C 制作游戏并且我有以下类型:

typedef struct{
    float x;
    float y;
} vector;

typedef struct{
    vector *vec;
    void (*update)();
} velocity;

typedef struct{
    vector *vec;
    velocity *vel;
    void (*move)();
} hero;

下面是给我一个错误的代码:

hero *h;
// allocate memory for hero 
h = malloc(sizeof(hero*));
// allocate memory for velocity
h->vel = malloc(sizeof(velocity*));

// initialize vectors
h->vec = malloc(sizeof(vector*));
h->vel->vec = malloc(sizeof(vector*));

free(h->vec); // free hero vector
free(h->vel->vec); // free velocity vector
free(h->vel); // free velocity
free(h); // free hero

出于某种原因,free(h->vel) 在尝试释放速度时给我一个错误。为什么会这样?提前致谢!!

最佳答案

当你这样做时:

h = malloc(sizeof(hero*));

您正在为指向英雄的指针分配空间,而不是英雄的实例

因此,您没有为结构分配足够的内存,并且写入结构的字段超出了分配内存的末尾。这会调用 undefined behavior ,在您的特定情况下,调用 free 时表现为崩溃。

sizeof 表达式中删除了 * 运算符,以便为您的结构实例分配足够的空间:

hero *h;
// allocate memory for hero 
h = malloc(sizeof(hero));
// allocate memory for velocity
h->vel = malloc(sizeof(velocity));

// initialize vectors
h->vec = malloc(sizeof(vector));
h->vel->vec = malloc(sizeof(vector));

关于c - 释放由 malloc 分配的结构的结构会导致错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45695281/

相关文章:

c - 如何在特定位置分配内存

c - C 程序的问题

不接受常量类型作为常量初始值设定项

c - 没有规则使 mbascii.o 需要目标 mbascii.c?

c - 指向 struct 的双指针中的第一个元素是 jiberrish

c# - 数组的内存分配

c# - 从 using 语句中修改值类型是未定义的行为吗?

c malloc 导致崩溃

c - union 和类型转换中的位填充结构

c++ - 可变函数 - 如何确保参数正确传递