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

  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]' ?

  7. #7
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 143
    Par défaut
    Ce que Diogene veut dire c'est que tu ne peut (en C) retourner l'adresse d'un ELEMENT LOCAL à une fonction.

    En effet lorsque tu appel ta fonction tu va réserver une zone mémoire pour celle-ci. Cette zone est libérée a la fin de l'execution de la fonction.

    Donc, à moins que tu n'ai déclaré ton élément en "static", tu ne peut retourner l'adresse.

    Cette regle ne s'applique pas aux éléments STATIC ni aux éléments que tu alloue dans la fonction.

    J'ai tout a fait le droit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char * ma_fonc(void)
    {
       char *pt;
       pt=malloc(50);
       return pt;
    }
    Si bien sur on met de côté les erreurs de compilations et autre du au malloc etc etc...

    Je peut aussi faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char * ma_fonc(void)
    {
       static char pt[50];
       return pt;
    }
    Mais dans ce cas, a chaque appel de ma_fonc je viendrai ecraser le resultat précédant... donc attention...

    La portée d'une variable est interne au bloc dans lequel elle est déclarée excepté les static et les alloués.

  8. #8
    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
    attention à quoi? (Y a-t-il un problème spécifique à utiliser cette solution par rapport aux autres ?)

  9. #9
    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
    Bah en fait quand tu déclares en static tu retournes un pointeur sur ce tableau. Mais si tu tentes de modifier le tableau dans la fonction appelante tu modifieras aussi le tableau de la fonction ma_fonc. Du coup si tu veux sauvegarder le pointeur tu ne peux pas, tu es obligé de passer par un strcpy.

  10. #10
    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
    ok, merci à tous pour vos réponses.

  11. #11
    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
    Je peut aussi faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char * ma_fonc(void)
    {
       static char pt[50];
       return pt;
    }
    Mais dans ce cas, a chaque appel de ma_fonc je viendrai ecraser le resultat précédant... donc attention...
    Oui, attention !
    Pas tellement parce que le tableau peut être modifié à chaque appel de la fonction car après tout, on peut s'y attendre.
    Mais surtout, il peut être modifié à l'extérieur de la fonction puisqu'on a communiqué son adresse ce qui lui donne implicitement tous les défauts liés aux variables globales (avec l'aggravation que les interventions sur cette variable ne sont plus directes mais "masquées" par l'utilisation de l'adresse )

+ 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