structures et allocation

structures et allocation - C - Programmation

Marsh Posté le 08-11-2005 à 16:49:54    

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:

Reply

Marsh Posté le 08-11-2005 à 16:49:54   

Reply

Marsh Posté le 08-11-2005 à 16:57:40    

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)
Reply

Marsh Posté le 08-11-2005 à 17:00:24    

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
Reply

Marsh Posté le 08-11-2005 à 17:09:58    

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/
Reply

Marsh Posté le 08-11-2005 à 17:19:44    

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:

Reply

Marsh Posté le 08-11-2005 à 17:38:09    

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 */
   }
 

Reply

Marsh Posté le 08-11-2005 à 18:06:21    

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  :)

Reply

Marsh Posté le 08-11-2005 à 18:34:07    

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/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed