Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3067 connectés 

  FORUM HardWare.fr
  Programmation
  C

  structures et allocation

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

structures et allocation

n°1241419
in_your_ph​ion
Posté le 08-11-2005 à 16:49:54  profilanswer
 

bonjour,
 
je voudrai créer un structure qui code un nom et un prénom sous la forme de deux chaines de caractères alloués dynamiquement. Est ce que je dois faire un malloc avant et faire pointer les membres de ma structure dessus ou est-ce qu'il y a moyen d'allouer directement dans la struture ?! ou encore mieux ?  :sweat:  
 
 
merci par avance  :D  :lol:  :love:  :hello:

mood
Publicité
Posté le 08-11-2005 à 16:49:54  profilanswer
 

n°1241433
Trollable
Posté le 08-11-2005 à 16:57:40  profilanswer
 

Tu dois allouer si tu utilises un char* ou un char[]. Le mieux est d'ecrire un constructeur qui se charge de tout.


---------------
The Million Dollar Screenshot  (seo v7ndotcom elursrebmem paesys wifi)
n°1241436
in_your_ph​ion
Posté le 08-11-2005 à 17:00:24  profilanswer
 

Trollable a écrit :

Tu dois allouer si tu utilises un char* ou un char[]. Le mieux est d'ecrire un constructeur qui se charge de tout.


 
ok .. merci . donc je dois allouer en dehors de ma structure ? et un constructeur c'est une fonction qui remplit tout ?


Message édité par in_your_phion le 08-11-2005 à 17:00:34
n°1241446
Emmanuel D​elahaye
C is a sharp tool
Posté le 08-11-2005 à 17:09:58  profilanswer
 

in_your_phion a écrit :

je voudrai créer un structure qui code un nom et un prénom sous la forme de deux chaines de caractères alloués dynamiquement. Est ce que je dois faire un malloc avant et faire pointer les membres de ma structure dessus ou est-ce qu'il y a moyen d'allouer directement dans la struture ?! ou encore mieux ?


Je conseille ceci :  


struct data
{
   char *s_nom;
   char *s_prenom;
};


Pour la création (par exemple) :  


   struct data record;
   char s[64];
   
   fgets(s, sizeof s, stdin);
   /* retirer proprement le '\n' */
   record.s_nom = strdup(s);
 
   fgets(s, sizeof s, stdin);
   /* retirer proprement le '\n' */
   record.s_prenom = strdup(s);


Nota : strdup() n'est pas standard mais POSIX, donc très portable.
 
On peut aussi envisager une solution complètement dynamique (constructeur) :


   struct data *p_record = data_create (nom, prenom);


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1241456
in_your_ph​ion
Posté le 08-11-2005 à 17:19:44  profilanswer
 

Emmanuel Delahaye a écrit :

Je conseille ceci :  


struct data
{
   char *s_nom;
   char *s_prenom;
};


Pour la création (par exemple) :  


   struct data record;
   char s[64];
   
   fgets(s, sizeof s, stdin);
   /* retirer proprement le '\n' */
   record.s_nom = strdup(s);
 
   fgets(s, sizeof s, stdin);
   /* retirer proprement le '\n' */
   record.s_prenom = strdup(s);


Nota : strdup() n'est pas standard mais POSIX, donc très portable.
 
On peut aussi envisager une solution complètement dynamique (constructeur) :


   struct data *p_record = data_create (nom, prenom);



 
wow .. :love: je connaissais pas strdup() mais c'est vraiment ce dont j'ai besoin. Juste pour savoir .. imaginons que je connaisse pas strdup(), comment faire avec malloc  :??:  je vois pas  :pfff:

n°1241467
Elmoricq
Modérateur
Posté le 08-11-2005 à 17:38:09  profilanswer
 

in_your_phion a écrit :

wow .. :love: je connaissais pas strdup() mais c'est vraiment ce dont j'ai besoin.


 
Attention, car avec strdup() comme avec malloc(), il faut utiliser free() pour désallouer la mémoire lorsqu'on n'en a plus l'usage.
 

in_your_phion a écrit :

Juste pour savoir .. imaginons que je connaisse pas strdup(), comment faire avec malloc  :??:  je vois pas  :pfff:


 
Pour reprendre l'exemple d'Emmanuel :
 

  struct data record;
   char s[64];
   
   fgets(s, sizeof s, stdin);
   /* retirer proprement le '\n' */
 
   record.s_nom = malloc((strlen(s) + 1) * sizeof *record.s_nom);
   if ( record.s_nom != NULL )
      strcpy(record.s_nom,s);
   else {
      /* gerer l'erreur d'allocation */
   }
 

n°1241512
in_your_ph​ion
Posté le 08-11-2005 à 18:06:21  profilanswer
 

Elmoricq a écrit :

Attention, car avec strdup() comme avec malloc(), il faut utiliser free() pour désallouer la mémoire lorsqu'on n'en a plus l'usage.
 
 
 
Pour reprendre l'exemple d'Emmanuel :
 

  struct data record;
   char s[64];
   
   fgets(s, sizeof s, stdin);
   /* retirer proprement le '\n' */
 
   record.s_nom = malloc((strlen(s) + 1) * sizeof *record.s_nom);
   if ( record.s_nom != NULL )
      strcpy(record.s_nom,s);
   else {
      /* gerer l'erreur d'allocation */
   }
 



 
 
merci mille fois  :)

n°1241533
Emmanuel D​elahaye
C is a sharp tool
Posté le 08-11-2005 à 18:34:07  profilanswer
 

in_your_phion a écrit :

wow .. :love: je connaissais pas strdup() mais c'est vraiment ce dont j'ai besoin. Juste pour savoir .. imaginons que je connaisse pas strdup(), comment faire avec malloc  :??:  je vois pas  :pfff:


 
C'est pas très dur. malloc(), memcpy()...
 
http://mapage.noos.fr/emdel/clib.htm
Module STR
STR_dup()
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  structures et allocation

 

Sujets relatifs
Allocation correcte en CFree et structures ...
[C][linux] msgget : problème d'allocationpb concernant les structures
Echanger des adresses structuresallocation dynamique
[PB] Tableau de structures[VB]Array sur tableau de structures
Question sur les structureshistoires de malloc et de structures
Plus de sujets relatifs à : structures et allocation


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)