IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Retourner une adresse de variable. pas de malloc ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 28
    Par défaut Retourner une adresse de variable. pas de malloc ?
    Bonjour.
    Voici mon interrogation.
    Je me demande la nuance entre 2 codes.
    dans un cas on déclare un pointeur et on malloc(), dans l'autre on déclare un contenu et on renvoie le pointeur.

    Au niveau du mécanisme du programme, est-ce que dans le cas ou on ne fait pas de malloc, le programme gère un 'malloc' automatique qui doit être free() ? Parce que pour moi on alloue une certaine mémoire mais sans malloc.
    Qu'en pensez vous ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    struct color *color_new(char newred, char newgreen, char newblue)
    {
      struct color new;
     
      new.red = newred;
      new.green = newgreen;
      new.blue = newblue;
      return (&new);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    struct color *color_new(char red, char green, char blue)
    {
         struct color *new;
    new = malloc(sizeof(*new));
    new->red = red;
    new->blue = blue;
    new->green = green;
    return (new);
    }

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    La 1ere forme est absolument à proscrire car c'est le crash assuré. En effet, tu retourne l'adresse d'une variable locale qui n'existe plus après la fin de la fonction. Donc tu retournes un pointeur fou.

    La seconde forme est correcte par contre, elle t'oblige à gérer à la main la libération de mémoire avec free() lorsque tu n'en a plus besoin.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 28
    Par défaut
    Merci.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 65
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    La seconde forme est correcte par contre, elle t'oblige à gérer à la main la libération de mémoire avec free() lorsque tu n'en a plus besoin.
    Il y aurait moyen de faire autrement ?

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Eh bien, il reste toujours l'option de déclarer la structure color hors de la fonction:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void color_constructor(struct color *This, char red, char green, char blue)
    {
    	This->red = red;
    	This->blue = blue;
    	This->green = green;
    }
     
    int main(void)
    {
    	struct color c;
    	color_constructor(c, 244, 243, 255);
    	return 0;
    }
    D'ailleurs, tu peux utiliser cette même fonction dans le color_new:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    struct color *color_new(char red, char green, char blue)
    {
    	struct color *This;
    	This = malloc(sizeof(*This));
    	if(This != NULL)
    		color_constructor(This, red, green, blue);
    	return This;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Tu es sur de vouloir manipuler des pointeurs pour ca?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct color color_new(char newred, char newgreen, char newblue)
    {
      struct color new;
     
      new.red = newred;
      new.green = newgreen;
      new.blue = newblue;
      return new;
    }

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 28
    Par défaut
    oui.

  8. #8
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Beurk, faire une allocation pour un truc qui va "peser" 3 octets... 32 bits de pointeur pour 24 bits de données, c'est pas franchement une bonne idée !!! Tu vas bouffer deux fois plus de mémoire en faisant ça, alors que tu peux parfaitement effectuer l'opération donnée par Jean-Marc.Bourguet... Et en plus, tu n'auras pas d'erreurs d'allocation/libération, au moins !!

    Ou, vu la simplicité de la structure, carrément mettre ça dans un entier 32 bits via des macros ou un bitfield...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 04/10/2014, 15h26
  2. [Doctrine] getEmail me retourne une doctrine collection et pas un string
    Par jfsenechal dans le forum ORM
    Réponses: 2
    Dernier message: 06/12/2010, 16h02
  3. retourne l'adresse d'une variable locale ou temporaire
    Par jojo000 dans le forum Débuter
    Réponses: 10
    Dernier message: 12/06/2009, 11h11
  4. Réponses: 2
    Dernier message: 17/10/2007, 15h10
  5. [PHPMailer] Les mails avec une adresse extérieure ne partent pas
    Par captaindidi dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 06/01/2006, 19h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo