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 :

comment utiliser free


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 136
    Par défaut comment utiliser free
    Bonjour,

    j'ai un petit doute sur l'utilisation de free(x), lorsque je veux que ma fonction retourne x. Doit-on faire free(x) puis return(x) (à mon avis ce return ne marche pas), ou return(x) puis free(x) (x est-il vraiment libéré?) ou faut-il créer une variable locale y=x, ou existe-t-il un moyen plus élégant?
    Voici ce que je souhaite faire (tout en libérant res au bon moment) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    char *time_t_to_string (time_t t)
    {
    	time_t *pt = &t;
    	char *res = (char*) calloc (16, sizeof(char));
    	res[16] = '\0';
    	strncpy (res, ctime (pt) + 4, 15);
    }
    Merci pour votre aide.

  2. #2
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut


    Regarde dans la <== Click on me !

  3. #3
    Inactif
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 136
    Par défaut
    Je connaissais l'idée de passer un pointeur à la fonction, mais j'aurais voulu l'éviter.
    J'avais commencé par une chaîne statique, mais ça ne marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    const char *time_t_to_string (time_t t)
    {
    	time_t *pt = &t;
    	char res[16];
    	res[16] = '\0';
    	strncpy (res, ctime (pt) + 4, 15);
    }

  4. #4
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Avec une chaîne déclarée en 'static' ça fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    const char *time_t_to_string (time_t t)
    {
    	time_t *pt = &t;
    	static char res[16];
    	res[16] = '\0';
    	strncpy (res, ctime (pt) + 4, 15);
    	return res;
    }

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    j'ai un petit doute sur l'utilisation de free(x), lorsque je veux que ma fonction retourne x. Doit-on faire free(x) puis return(x) (à mon avis ce return ne marche pas)
    Il ne marche pas : tu retournerais l'adresse d'une variable détruite (même problème avec char res[16]).

    ou return(x) puis free(x) (x est-il vraiment libéré?)
    Non, il ne sera pas libéré parce que tu quitteras la fonction avant l'exécution du free().

    -Tu ne peux donc faire le free() qu'après avoir retourné le x, donc hors de la fonction.

    -Il est aussi possible de laisser la question de création/destruction du tableau au code appelant la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void time_t_to_string (time_t t, char* res)
    {
    	strncpy (res, ctime (&t) + 4, 15);
    	res[16] = '\0';
    }

  6. #6
    Inactif
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 136
    Par défaut
    Bonjour,
    merci à vous deux pour ces réponses.
    Diogène, pouvez-vous expliquer plus en détail pourquoi c'est le "même problème avec char res[16]' ?

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/02/2009, 12h06
  2. comment utiliser actionscript ?
    Par webs dans le forum Flash
    Réponses: 3
    Dernier message: 09/02/2003, 23h11
  3. Comment utiliser OUT ?
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 3
    Dernier message: 20/07/2002, 09h35
  4. Réponses: 5
    Dernier message: 11/06/2002, 15h21

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