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 :

Clarification sur la durée de vie des variables et l'allocation


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 20
    Points : 12
    Points
    12
    Par défaut Clarification sur la durée de vie des variables et l'allocation
    Bonjour, je débute en programmation C et j'aimerais comprendre un peu plus en détail ce qui se passe lors de l'exécution de ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int* create(void)
    {
    	int b = 3;
    	int *a = &b;
    	*a = 5;
    	return a;
    }
     
    int main(void)
    {
    	int* number = test();
    	printf("%d", number);
    }
    Si je fais un printf de number, cela m'affiche 5. Or je ne comprends pas car ma fonction create renvoi un pointeur sur une variable locale de cette fonction (à savoir la variable b).
    Mais normalement, étant donné que c'est une variable locale, elle devrait être détruite à la fin de l'exécution de la fonction create. Du coup create va renvoyer un pointeur sur une variable qui va être détruite.
    Ma question est, pourquoi alors number vaut 5 ? (Aurais-je fais une allocation dynamique sans m'en rendre compte ?

  2. #2
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Mais normalement, étant donné que c'est une variable locale, elle devrait être détruite à la fin de l'exécution de la fonction create. Du coup create va renvoyer un pointeur sur une variable qui va être détruite.
    Exact. On ne doit jamais renvoyez l'adresse d'une variable locale.

    Ma question est, pourquoi alors number vaut 5 ? (Aurais-je fais une allocation dynamique sans m'en rendre compte ?
    Non, tu n'as pas fait de l'allocation dynamique sans le savoir. C'est simplement que la mémoire utilisée par la variable locale b n'a pas été encore réutilisée. Donc, pur hasard.
    Dans un tel cas, le comportement est indéfini.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Membre confirmé
    Avatar de haraelendil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 283
    Points : 533
    Points
    533
    Par défaut
    non tu n'as pas fait d'allocation dynamique, ne t'inquiète pas.

    Ça ne viendrait pas du fait que ta fonction s'appelle create mais que dans ton main tu appelle test?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par haraelendil Voir le message
    Ça ne viendrait pas du fait que ta fonction s'appelle create mais que dans ton main tu appelle test?
    Oups j'ai mal écrit le message quand j'ai posté de mémoire mon bout de code sur le forum. Dans mon programme j'utilise bien la bonne fonction. (create et non pas test).

    Merci diogene pour m'avoir donné la réponse.

    Du coup si je veux que mon code soit correct je dois écrire ça ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int* create(void)
    {
    int *a = (int*)malloc(1*sizeof(int));
     
    a = 5;
    return a;
    }
    faire un malloc pour allouer un seul int me semble un peu superflux. :/

  5. #5
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Du coup si je veux que mon code soit correct je dois écrire ça ? :
    Oui.
    faire un malloc pour allouer un seul int me semble un peu superflux. :/
    C'est un exemple pour le principe.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  6. #6
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par dream25 Voir le message
    Du coup si je veux que mon code soit correct je dois écrire ça ? :
    int* create(void)
    {
    int *a = (int*)malloc(1*sizeof(int));
    *a = 5;
    return a;
    }

    faire un malloc pour allouer un seul int me semble un peu superflux. :/
    Si tu n'as besoin que d'un int et que tu n'as pas de nécessiter de retourner une adresse, on ferait plus probablement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int create(void)
    {
    	int a;
    	a = 5;
    	return a;
    }
    qui se simplifie bien évidement en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int create(void)
    {
    	return 5;
    }

  7. #7
    Membre averti
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2008
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Octobre 2008
    Messages : 187
    Points : 448
    Points
    448
    Par défaut
    Citation Envoyé par dream25 Voir le message
    faire un malloc pour allouer un seul int me semble un peu superflux. :/
    Pour éviter de faire un malloc, tu peut également écrire cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void create( int* a ) {
        *a = 5;
    }
     
     
    int main() {
        int a;
        create( &a );
        printf( "%d", a );
    }
    EDIT : un * qui trainait dans le printf...

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Je suis d'accord avec toutes ces réponses, merci beaucoup.

    Sinon j'aurais une autre question concernant les mallocs en C. Si je suis amené à faire des mallocs, faut-il que je garde un pointeur sur toutes les différentes allocations manuelles que j'ai faites afin de les libérer à la fin du programme (avec la fonction free) ? Comment se débrouille-t-on en pratique ? Utilise-t-on un tableau qui regroupe les différents pointeurs à libérer en fin de programme ?

  9. #9
    Membre confirmé
    Avatar de haraelendil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 283
    Points : 533
    Points
    533
    Par défaut
    Bah deux options, soit tu crées un tableau qui stock tous tes pointeurs au fur et à mesure que tu les crée, soit tu fait directement un tableau dynamique où tu utilise les éléments au fur et à mesure de tes besoins ....

  10. #10
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par dream25 Voir le message
    ...
    Sinon j'aurais une autre question concernant les mallocs en C. Si je suis amené à faire des mallocs, faut-il que je garde un pointeur sur toutes les différentes allocations manuelles que j'ai faites afin de les libérer à la fin du programme (avec la fonction free) ? Comment se débrouille-t-on en pratique ? Utilise-t-on un tableau qui regroupe les différents pointeurs à libérer en fin de programme ?
    La question ne devrait pas être posée de cette façon.
    Tu crées un objet par allocation dynamique. Lorsque cet objet est devenu inutile dans le déroulement du programme, tu dois le supprimer : il n'y a aucune raison de le conserver plus longtemps et de différer sa libération.
    C'est donc dicté par la logique de ton programme. Si tu suis correctement cette logique, tous les objets seront libérés une et une seule fois.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

Discussions similaires

  1. [PHP 5.2] Comment est gérée la durée de vie des variables ?
    Par Christophe Charron dans le forum Langage
    Réponses: 4
    Dernier message: 27/02/2009, 11h16
  2. Scope et durée de vie des variables
    Par TwoHorned dans le forum Langage
    Réponses: 2
    Dernier message: 30/08/2007, 16h28
  3. Duree de vie des variables
    Par biggione dans le forum Struts 2
    Réponses: 2
    Dernier message: 20/07/2007, 10h12
  4. Dureé de vie des données dans un flash disque
    Par Tsimplice dans le forum Composants
    Réponses: 5
    Dernier message: 28/05/2007, 10h01
  5. "Batch select" et duree de vie des connections
    Par KillMePlease dans le forum JDBC
    Réponses: 1
    Dernier message: 28/02/2007, 21h23

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