2017-08-15 78 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);