2017-08-15 100 views
1

所以我想用C做一个游戏,我有以下几种类型:释放由malloc分配的结构的结构会导致错误?

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)在尝试释放速度时给了我一个错误。为什么会发生?提前致谢!!

+2

我想你的意思在此声明分配型的英雄,而不是指针英雄*的对象h = malloc(sizeof(hero)); –

+0

请了解如何创建[最小,完整和可验证示例](http://stackoverflow.com/help/mcve)。 –

+0

错误说的是什么? –

回答

4

当你这样做:

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)); 
+0

谢谢,这个帮了很多! –

1

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

h = malloc(sizeof *h); 

与其他分配相同。

因为你分配较少的内存,您的分配来的h成员将带领您将数据写入您的分配内存的界限,而这又将会导致未定义行为

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