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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de zentaf
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    122
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 122
    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.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    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 026
    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 Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    872
    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 : 872
    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 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    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 026
    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 Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    872
    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 : 872
    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 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    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 026
    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;
    }

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