C语言 释放由malloc分配的结构的结构会导致错误?



所以我正在尝试使用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*));

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

因此,您没有为结构分配足够的内存,并且写入结构的字段会写入超过分配的内存的末尾。 这将调用未定义的行为,在您的特定情况下,该行为在调用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));

假设h被声明为hero *h;,那么你为指向hero的指针分配足够的内存,而不是实际的hero结构。更改为

h = malloc(sizeof *h);

与其他分配相同。

由于分配给的内存很少,因此分配给h成员将导致将数据写入分配的内存范围之外,这反过来又会导致未定义的行为

h = malloc(sizeof(hero*));

您只需为指针的大小分配内存,而不是结构本身

所有其他的也是如此

对于微距粉丝:

#define SMALLOC(x)      (malloc(sizeof *(x)))
hero *h;
h = SMALLOC(h);
h->vel = SMALLOC(h->vel);
// initialize vectors
h->vec = SMALLOC(h->vec)
h->vel->vec = SMALLOC(h->vel->vec);

相关内容

  • 没有找到相关文章