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 :

chaine de caractères en argument de fonction


Sujet :

C

  1. #1
    Membre du Club Avatar de zentaf
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 122
    Points : 65
    Points
    65
    Par défaut chaine de caractères en argument de fonction
    Bonjour,

    J'ai quelques questions à propos du code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void fct(char **ch){
        char *c = "coucou";
        *ch = c;
    }
     
    int main(){
     
    char *ch = NULL;
    fct(&ch);
    printf("\nch = %s",ch);
     
      	return 0;
     }
    la chaine ch pointe sur le même zone mémoire que c, qui est "coucou"..

    la question est :
    Le fait que c est une variable locale, elle sera détruite à la fin de la fonction, donc pourquoi ch contient t-elle tjs la chaine coucou?

    autrement dit, qui est détruit à la fin de la fonction, la zone mémoire pointée par c ou juste le lien (le pointeur c)?

    Quel impacts si échange de chaines de cette façon ?

    Merci,
    zentaf.
    Les hommes sont des caisses fermées dont la clé est l'épreuve..

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 211
    Points
    23 211
    Par défaut
    Bonjour,

    "chaine" est une chaîne de caractère qui sera stockée dans le "data segment" de ton programme, c'est à dire dans ton fichier exécutable. Contrairement aux variables locales qui sont stockées sur la pile.

    Or le "data segment" est en lecture seule donc déjà, il faut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char * foo = "foo";
    Ensuite, le pointeur pointera sur la chaîne de caractère qui est dans le data segment et qui existe donc du début à la fin du programme. Il n'y a donc pas de copie de la chaîne de caractère.

    char * c est donc bien une variable locale qui sera libérée à la fin de l'exécution de ta fonction mais "foo" n'est, quant à elle pas une variable et ne sera pas libérée à la fin de l'exécution de ta fonction.

  3. #3
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Pour completer ce que dit Neckara, en memoire, la chaine "coucou" va rester telle qu'elle tant que rien d'autre n'aura ete ecrit par-dessus. On pourrait meme faire la comparaison avec un disque dur lorsque tu effaces ton fichier de maniere classique. Tant que rien n'aura ete ecris par-dessus, les donnees resteront et c'est comme ca que des logiciels permettent de "recuperer" des donnees supprimees.

    Cependant, au moment ou tu affiches ch, tu accedes a une portion de memoire qui ne t'es pas allouee. La bonne facon de faire serait de faire un malloc dans ta fonction fct (et de ne pas oublier de la free dans le main).

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 211
    Points
    23 211
    Par défaut
    Citation Envoyé par imperio Voir le message
    Cependant, au moment ou tu affiches ch, tu accedes a une portion de memoire qui ne t'es pas allouee. La bonne facon de faire serait de faire un malloc dans ta fonction fct (et de ne pas oublier de la free dans le main).
    Sauf que là, la chaîne de caractère est dans le data segment.
    La mémoire est donc toujours "allouée" car est est "allouée" du début à la fin du programme puisque la chaîne de caractère est dans ce cas là dans le data segment.

  5. #5
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    @Neckara: Il me semblait que, meme si c'etait contenu dans le data segment, a la sortie de la fonction, tout ce qui n'a pas ete alloue est "detruit". Je vais me renseigner.

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 211
    Points
    23 211
    Par défaut
    Le contenu du "data segment" ne change pas du début à la fin du programme.

    Grosso-modo, ce serait comme avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    const int * foo(void)
    {
          static const int i = 0;
          return &i;
    }

  7. #7
    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
    @imperio :
    Mais c'est l'objet c qui est en allocation automatique et qui sera détruit en sortie de fonction, pas l'objet "coucou" qui est en allocation statique (et de plus non modifiable)
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  8. #8
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    @Neckara & @diogene: OK ! Je viens de capter en farfouillant un peu partout. Un element stocke dans la "string_table" d'un executable est "accessible" en permanence meme apres la destruction de l'objet qui y accedait (je sais pas si ce que j'ai dit est comprehensible...). Merci a vous deux.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Par contre, si ça avait été ceci, ça aurait foiré:
    Code C mauvais : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void fct(char **ch){
        char c[] = "coucou";
        *ch = c; /*Oups!*/
    }
    Car là, la chaîne aurait été sur la pile.
    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.

Discussions similaires

  1. Problème avec une chaîne de caractère en argument de fonction
    Par R3v3n4nt dans le forum Interfaces Graphiques
    Réponses: 0
    Dernier message: 09/03/2013, 13h10
  2. [XL-2007] Chaine de caractère pour Email en fonction de la valeur d'une Liste
    Par brunounours dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 13/12/2011, 12h38
  3. Réponses: 2
    Dernier message: 18/01/2011, 11h17
  4. [Débutant] Passage de chaines de caractères en argument
    Par SAKDOSS dans le forum MATLAB
    Réponses: 2
    Dernier message: 05/12/2010, 11h37
  5. Réponses: 10
    Dernier message: 17/12/2003, 13h51

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