2017-08-15 6 views
1

Je suis en train de faire un jeu en C et je les types suivants:Libérer la structure des structures allouées par malloc provoque une erreur?

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

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

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

Et est le code suivant ici qui me donne une erreur:

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 

Pour une raison , free (h-> vel) me donne une erreur en essayant de libérer la vélocité. Pourquoi cela arrive-t-il? Merci d'avance!!

+2

Je pense que vous voulez dire l'attribution d'un objet du héros de type au lieu du héros de pointeur * dans cette déclaration h = malloc (taille de (héros)); –

+0

Veuillez apprendre comment créer un [Exemple minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve). –

+0

Que dit l'erreur? –

Répondre

4

Lorsque vous faites ceci:

h = malloc(sizeof(hero*)); 

Vous allouez de l'espace pour un pointeur au héros, pas un instance du héros. Par conséquent, vous n'allouez pas assez de mémoire pour vos structures et l'écriture dans les zones de la structure écrit après la fin de la mémoire allouée. Cela appelle undefined behavior, qui dans votre cas particulier se manifeste comme un plantage lors de l'appel free.

Retirées l'opérateur * des sizeof expressions d'allouer suffisamment d'espace pour une instance de struct:

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

Merci, cela a beaucoup aidé! –

1

En supposant que h est déclarée comme hero *h; vous allouer suffisamment de mémoire pour un pointeur -hero, pas la structure hero réelle. Passer à

h = malloc(sizeof *h); 

Identique aux autres allocations.

Parce que vous allouez à peu de mémoire, vos missions aux membres de h vous mènera à écrire des données hors des limites de votre mémoire allouée, et qui à son tour conduire à un comportement non défini .

0
h = malloc(sizeof(hero*)); 

Je vous rappelle juste alloc pour la taille du pointeur pas la structure elle-même

Tous les autres aussi bien

Pour les fans macro:

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