Ca c'est bon :
1 2 3 4 5 6
| typedef struct donnees_vecteur {
int taille;
int *donnees;
} vecteur;
v=malloc(sizeof(vecteur)); |
Le problème plus haut c'était que tu cachais un pointeur dans un typedef, ce qui n'est pas une erreur en soi, mais une source de confusions. En effet, tu allouais non pas la taille de la structure mais la taille d'un pointeur.
1 2 3 4
| typedef struct donnees_vecteur {
int taille;
double *donnees;
} *vecteur; |
Ici, vecteur n'est pas une structure mais un pointeur sur structure. Donc lorsque tu fais
v=malloc(sizeof(vecteur));
tu réserves non pas la taille d'une structure mais celle d'un pointeur de structure. Or, la taille n'est pas censée être la même, ce qui a toutes les chances de provoquer un crash.
C'est pour cette raison qu'il est préférable d'éviter de cacher un pointeur dans un nom de structure car même si le langage le permet ça reste quand même une bonne manière de créer la confusion et donc un programme buggué.
La règle est simple : toujours mettre la taille de l'objet pointé ou un multiple de cette taille si on veut un tableau.
Et pour simplifier davantage les choses tu peux même écrire :
1 2
| type * pobjet ;
pobjet = malloc( sizeof *pobjet ); /* sizeof *pobjet == sizeof( type ) */ |
Partager