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 :

question sur les pointeurs


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 81
    Points : 39
    Points
    39
    Par défaut question sur les pointeurs
    bonjour,
    j' utilise les pointeurs sans trop faire de bêtises, mais il y à des questions dont je n' ai trouvé les réponses nul part :

    quand j' assigne l' adresse d' une constante à un pointeur :
    char *p;
    p = "coucou developpez"

    est-ce qu' il s' agit d' une forme d' allocation dynamique ? La constante est stockée en mémoire, puis oubliée si je fait pointer p sur NULL. Y à t' il une table qui gère toute ses allocation ?
    comment la partie qui gère les ressources 'sait' que "coucou developpez" est pointé ( et plus pointée ) ?

    Si je veux que p pointe sur la même chaine (mais à une autre adresse) que celle contenu dans un tableau de char, en passant par ce même genre d' allocation, comment puis-je faire ? (voyez-vous ma question ?)

    merci d' allumer la lumière !

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 81
    Points : 39
    Points
    39
    Par défaut
    j' ai une dernière question (qui semble montrer que je n' ai compris aussi bien que je l' espérais) ; dans ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void strcpy(char *CH1, char *CH2)
    {
     while (*CH1++ = *CH2++) 
            ;
    }
    la constante pointée par CH1 est modifiée. Il ne peut donc pas s' agir d' une constante ?
    Pourquoi ce genre de code ne peut-il pas donner d' erreur de segmentation ? Si le contenu de CH2 est plus grande que celui de CH1, la chaine ne va t' elle pas s' étendre dans une zone incertaine de la mémoire ? (à la place d' une autre variable ..)

    Désolé pour toutes ces question, et merci encore.
    echantillon

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Déjà la première question.

    Pour le cas d'un pointeur sur constante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    const char* pSolution = "La solution est: 42";
    Cette chaine est stocké dans le problème (dans le .exe (ou autre)) lui même. Du coup, les problème d'allocation / déallocation ne se pose plus. On appelle cela la mémoire statique (on ne peut pas vraiment la changer, n'est ce pas)
    Pour les cas avec de la mémoire dynamique (malloc / calloc / free) il faudra bien sur faire toutes les allocations / déallocation nous mêmes.
    Un malloc/calloc dit en fait au système:
    "Bonjour, je voudrais un peu de mémoire, s'il vous plait". Mais le système, sans free() ne sait pas quand on lui rend. Et puis votre programme n'est pas obligé de demandé de la mémoire. Cette mémoire, c'est la mémoire vive.

    ----

    Pour la deuxième question, le programme aura de grande chance de planté si la mémoire pointé par CH1 est plus petite que la mémoire utilisé par la chaine pointé par CH2.

    Pour les histoires de constantes ... les pointeurs sont passé par copie de la fonction appelante à la fonction strcpy(). Donc, si on modifie les pointeur, cela n'a aucune incidence dans le reste du programme. Par contre le contenu pointé, lui est bien copié.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Salut

    quand j' assigne l' adresse d' une constante à un pointeur :
    char *p;
    p = "coucou developpez"

    est-ce qu' il s' agit d' une forme d' allocation dynamique ? La constante est stockée en mémoire, puis oubliée si je fait pointer p sur NULL. Y à t' il une table qui gère toute ses allocation ?
    La chaine est stockée quelque part en mémoire, dans une zone en lecture seule. En cas de modification de la chaine, le programme crashe. Il n'y a pas d'allocation dynamique, il ne faut surtout pas faire de free dessus.

    Quand tu écris une chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char p[] = "coucou developpez" ;
    là, "p" n'est plus un pointeur mais un tableau, initialisé avec la chaine entre guillemets. Son contenu est modifiable, ce tableau est situé dans une autre zone de mémoire.

    Le cas où on parle d'allocation dynamique serait quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char * p;
    char * chaine = "coucou developpez";
     
    p = malloc (strlen(chaine) + 1); /* Allocation dynamique */
    strcpy(p , chaine) ; /* On remplit la mémoire allouée avec la chaine "coucou developpez" */
    dans ce cas, il faudrait effectuer un free sur p lorsqu'on ne compte plus se servir de cette chaine.

    ~~~~~~~~

    j' ai une dernière question (qui semble montrer que je n' ai compris aussi bien que je l' espérais) ; dans ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void strcpy(char *CH1, char *CH2)
    {
     while (*CH1++ = *CH2++) 
            ;
    }
    la constante pointée par CH1 est modifiée. Il ne peut donc pas s' agir d' une constante ? Pourquoi ce genre de code ne peut-il pas donner d' erreur de segmentation ?
    Si tu envoies l'adresse d'une chaine constante comme premier argument de la fonction, le programme crashe. On ne peut pas modifier une chaine constante.

    Si le contenu de CH2 est plus grande que celui de CH1, la chaine ne va t' elle pas s' étendre dans une zone incertaine de la mémoire ? (à la place d' une autre variable ..)
    Si. Et c'est souvent le genre de bug qui fait sortir de la fumée des oreilles, si on n'a pas l'oeil. Il est préférable d'utiliser strncpy que strcpy à cause de ce genre de raison.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Bonjour,

    Ce sont de très bonnes questions !

    Citation Envoyé par echantillon Voir le message
    quand j' assigne l' adresse d' une constante à un pointeur :
    char *p;
    p = "coucou developpez"

    est-ce qu' il s' agit d' une forme d' allocation dynamique ? La constante est stockée en mémoire, puis oubliée si je fait pointer p sur NULL.
    Eh non. La chaîne est question est compilée et vient prendre place au sein de l'exécutable généré. Elle sera chargée en mémoire en même temps que le code dans un segment dédié (en read-only).

    Le compilateur est à même de déduire son emplacement en mémoire (au moins relativement au début de l'exécutable ou du segment concerné), et va l'affecter à ton pointeur. Si tu remplaces son contenu par NULL, tu ne peux plus retrouver ta chaîne, mais celle-ci ne sera pas libérée. D'un autre côté, il ne s'agit pas de fuite de mémoire non plus car tu ne peux pas allouer, à l'exécution, de mémoire de cette façon, et tu ne peux pas non plus libérer l'espace de la chaîne « codée en dur » (ce qui est normal).

    Y à t' il une table qui gère toute ses allocation ? comment la partie qui gère les ressources 'sait' que "coucou developpez" est pointé ( et plus pointée ) ?
    C'est effectivement ce qui ce passe lorsque tu fais une allocation explicite avec la fonction malloc(). Celle-ci te renvoie un pointeur vers la mémoire allouée, qu'il te faudra libérer ultérieurement et explicitement avec free().

    Sinon, dans ton cas de figure, c'est le compilateur qui définit cette adresse, et c'est à ce moment que cela se passe.

    Si je veux que p pointe sur la même chaine (mais à une autre adresse) que celle contenu dans un tableau de char, en passant par ce même genre d' allocation, comment puis-je faire ? (voyez-vous ma question ?)
    Tu alloues un tableau de caractères, tu y copies la chaîne de référence avec strncpy(), et tu affectes l'adresse de ton tableau à p.

    C'est pour cela que la gestion de chaîne a l'air si fastidieuse en C, par rapport à d'autres langages. Cela peut s'expliquer en une question : en quel langage est écrite la « partie qui gère les ressources » ? :-)

    Le C te permet de travailler à très bas niveau. En général, tu vas manipuler les adresses réelles de tes chaînes en mémoire, et pas de simples références. Ce qui signifie aussi que si tu te trompes, ton programme va planter car il n'aura pas de moyen de s'en rendre compte par lui-même.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 81
    Points : 39
    Points
    39
    Par défaut
    bonsoir,
    merci pour toute vos réponses instructives, claires, comme toujours ici ..!

    je dois dire que je n' avais jamais pensé que le compilateur intégrait les constantes dans le programme lui même.
    Ca change toute ma façon de voir ce genre de déclarations, répond à pleins de question, et distingue plus fermement les pointeurs des tableaux lors de leurs initialisations.
    Mais pourquoi n' est-ce pas dit plus souvent !?
    ;°)

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Citation Envoyé par echantillon Voir le message
    Mais pourquoi n' est-ce pas dit plus souvent !?;°)
    Parce que le C date de 1972 ! :-) Et surtout parce que si les ordinateurs fonctionnent toujours de la même façon (d'où la pérennité du langage), il est de plus en plus difficile de manipuler directement la machine, à cause des systèmes multi-tâches, mais également de l'augmentation en puissance des machines (qui tournent entre 1000 et 2000 fois plus vite qu'il y a 25 ans) ce qui rend les choses moins palpables, et de la flopée de langages et de technologie, qui s'empilent avec le temps, et qu'il faut traverser quand on cherche à redescendre tout en bas.

Discussions similaires

  1. Question sur les pointeurs génériques
    Par mikedavem dans le forum C
    Réponses: 16
    Dernier message: 24/05/2006, 11h56
  2. question sur les pointeurs
    Par jd.baculard dans le forum Langage
    Réponses: 3
    Dernier message: 18/03/2006, 02h30
  3. [Debutant] Nouvelle question sur les pointeurs
    Par etiennegaloup dans le forum Débuter
    Réponses: 3
    Dernier message: 11/01/2006, 09h55
  4. Question sur les pointeurs.
    Par Chrisemi dans le forum C++
    Réponses: 5
    Dernier message: 28/10/2005, 23h47
  5. questions sur les pointeurs
    Par Hyoga dans le forum C++
    Réponses: 17
    Dernier message: 08/01/2005, 23h25

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