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