101 votes

malloc pour les structures et les pointeurs en C

Supposons que je veuille définir une structure représentant la longueur du vecteur et ses valeurs comme :

struct Vector{
    double* x;
    int n;
};

Maintenant, supposons que je veuille définir un vecteur y et lui allouer de la mémoire.

struct Vector *y = (struct Vector*)malloc(sizeof(struct Vector));

Mes recherches sur Internet montrent que je dois allouer la mémoire pour x séparément.

y->x = (double*)malloc(10*sizeof(double));

Mais, il semble que j'alloue la mémoire pour y->x deux fois, l'une pendant l'allocation de la mémoire pour y et l'autre pendant l'allocation de la mémoire pour y->x, et cela semble un gaspillage de mémoire. J'apprécierais beaucoup que vous me fassiez savoir ce que le compilateur fait réellement et quelle serait la bonne façon de procéder. initialiser à la fois y et y->x.

Merci d'avance.

1voto

oleg_g Points 502

Le premier malloc alloue la mémoire pour la structure, y compris la mémoire pour x (pointeur vers le double). La deuxième malloc alloue la mémoire pour la valeur double vers laquelle x pointe.

1voto

PQuinn Points 1002

Vous pourriez en fait faire cela en un seul malloc en allouant pour le vecteur et le tableau en même temps. Par exemple :

struct Vector y = (struct Vector*)malloc(sizeof(struct Vector) + 10*sizeof(double));
y->x = (double*)((char*)y + sizeof(struct Vector));
y->n = 10;

Cela alloue le vecteur 'y', puis fait pointer y->x vers les données supplémentaires allouées immédiatement après la structure Vector (mais dans le même bloc de mémoire).

Si le redimensionnement du vecteur est nécessaire, vous devez le faire avec les deux allocations comme recommandé. Le tableau interne y->x pourra alors être redimensionné tout en conservant la structure vectorielle 'y' intacte.

-1voto

Constant Asg Points 1

Quand vous malloc(sizeof(struct_name)) il alloue automatiquement de la mémoire pour la taille complète de la structure, vous n'avez pas besoin de malloquer chaque élément à l'intérieur.

Utilisez -fsanitize=address pour vérifier comment vous avez utilisé la mémoire du programme.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X