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 :

Chaines et pointeurs mais pas "const"


Sujet :

C

  1. #1
    Membre actif
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Points : 207
    Points
    207
    Par défaut Chaines et pointeurs mais pas "const"
    Salut,
    je suis un peu debutant et je me permet de vous posez cette question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char* pStr="ABCD";
    pStr[0]='x'; // ici : erreur
    ne marche pas et plante sur la modification du 1er octet de la chaine "ABCD"

    pourtant je n'ai PAS mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char* pStr="ABCD";
    Là j'aurrai compris, puisqu'il y a le "const"

    alors pourquoi ?
    merci

  2. #2
    Membre expérimenté
    Avatar de nyal
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    622
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 622
    Points : 1 428
    Points
    1 428
    Par défaut
    Bonjour,

    C'est parce que pour le compilateur c'est equivalent.
    Tu dois utiliser gcc je pense.
    Si tu veux que le compilateur gere cela dans un segment memoire en ecriture il faut mettre une option de compilation.

    Par exemple pour gcc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    -fwritable-strings

  3. #3
    Membre actif
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Points : 207
    Points
    207
    Par défaut
    merci pour l'info,
    en fait, c'est pas avec gcc, (promis dés que je reboot sous mdk, j'essaie)
    mais avec Visual Studio 6.

    quelqu'un connait'il cette option pour VC++ ? (gépatrouvai)

    merci

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut Re: Chaines et pointeurs mais pas "const"
    Citation Envoyé par hpfx
    Salut,
    je suis un peu debutant et je me permet de vous posez cette question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char* pStr="ABCD";
    pStr[0]='x'; // ici : erreur
    ne marche pas et plante sur la modification du 1er octet de la chaine "ABCD"

    pourtant je n'ai PAS mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char* pStr="ABCD";
    Là j'aurrai compris, puisqu'il y a le "const"

    alors pourquoi ?
    merci
    J'ai eu le même problème il y a quelques temps sans comprendre d'ou venait l'erreur et je l'ai finalement comprise lorsque tu écris tu alloues un espace mémoire en lecture seule pointant vers la chaine constante ABCD, autrement dit tu alloues de la mémoire sur laquelle tu ne peux écrire.
    Pour arriver à pallier ce "problème" deux alternatives s'offrent a toi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char pStr[]="ABCD";
    ou
    bien utiliser la fonction strcpy ou strncpy du C.
    A bientot!

  5. #5
    Membre actif
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Points : 207
    Points
    207
    Par défaut
    ha oui, en effet ca marche mieux avec
    mais, mais ??? mais... moi je croyais que ca faisait la même chose !!!???
    "ABCD" est constante aussi là ? non ? (non apparament puisque ca marche)

    donc si je comprend, la chaine "ABCD" sera alloué à l'execution (avec char pStr[]) ? c'est ca ?

    j'aime bien comprendre (le fait que celà marche ne me suffit pas, sinon je ne ferais pas du C )

    aussi, tu peu detailler ta 2eme methode ? (strcpy) ? .. c'est pour comprendre..

    merci

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par hpfx
    ha oui, en effet ca marche mieux avec
    mais, mais ??? mais... moi je croyais que ca faisait la même chose !!!???
    "ABCD" est constante aussi là ? non ? (non apparament puisque ca marche)

    donc si je comprend, la chaine "ABCD" sera alloué à l'execution (avec char pStr[]) ? c'est ca ?
    j'aime bien comprendre (le fait que celà marche ne me suffit pas, sinon je ne ferais pas du C )
    Pas tout a fait dans ce cas tu utilises un tableau statique de caractères (donc alloué lors de la compilation) et le fait que ce soit un tableau te permet de modifier les éléments.
    Pour etre bref et clair,
    lorsque tu utilises
    ton pointeur pointe vers la chaine constante ABCD qui est située dans une zone mémoire non écrivable.
    Lorsque tu écris
    Tu définis un tableau de facon statique (dans le sens ou il est alloué lors de la compilation) et tu peux modifier tres facilement les éléments de ce tableau.
    Voila une des différences entre ces 2 types d'écriture .

    aussi, tu peu detailler ta 2eme methode ? (strcpy) ? .. c'est pour comprendre..
    merci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    int
    main()
    {
      char* pStr= malloc(6);
      strncpy(pStr,"ABCD",5);
     
    printf("%s\n",pStr);
      return 0;
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    E:\home\test>gcc test.c
     
    E:\home\test>a.exe
    ABCD
     
    E:\home\test>
    A bientot
    [/url]

  7. #7
    Membre actif
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Points : 207
    Points
    207
    Par défaut
    Merci KORTA,
    ca marche bien avec le mallloc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      char* Str= (char*)malloc(6);
      strncpy(Str,"ABCD",5); 
      Str[0]='x'; //ca marche!
    J'ai juste rajouté le cast pour faire joli.

  8. #8
    Membre actif
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Points : 207
    Points
    207
    Par défaut Re: Chaines et pointeurs mais pas "const"
    Citation Envoyé par KORTA
    ... lorsque tu écris tu alloues un espace mémoire en lecture seule pointant vers la chaine constante ABCD, autrement dit tu alloues de la mémoire sur laquelle tu ne peux écrire.
    T'es infos m'on permis de bien progresser, et je me permet de revenir pour pinailler un peu.
    quand je fait C'est pas l'espace memoire qui est en lecture seule mais la chaine qui est pointé ("abc" dans mon cas) !
    l'espace memoire (pStr lui n'est pas en lecture seulle, tu peux en faire ce que tu veux en fait)
    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pStr++; //fait pointer sur le 2eme caractere
    printf("%c",*pStr); // donne 'b'
    et d'ailleur j'ai testé, on peu tres bien faire pointer pStr vers une chaine qui n'est pas en lecture seulle, ca marche aussi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char *pStr="ha?"; // "ha?" est en lecture seule
    char x[5]="xyzt";
    pStr=x;
    pStr[0]='z'; // ca marche!!
    ca prouve bien que c'est uniquement la chaine "ha?" qui est en lecture seule.
    pStr n'est pas en lecture seule, ni intrinsequement ce vers quoi il pointe.

    voilà, c'est du pinaillage, je sais, mais bon...

    a+

  9. #9
    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 Re: Chaines et pointeurs mais pas "const"
    Citation Envoyé par hpfx
    Citation Envoyé par KORTA
    ... lorsque tu écris tu alloues un espace mémoire en lecture seule pointant vers la chaine constante ABCD, autrement dit tu alloues de la mémoire sur laquelle tu ne peux écrire.
    T'es infos m'on permis de bien progresser, et je me permet de revenir pour pinailler un peu.
    quand je fait C'est pas l'espace memoire qui est en lecture seule mais la chaine qui est pointé ("abc" dans mon cas) !
    l'espace memoire (pStr lui n'est pas en lecture seulle, tu peux en faire ce que tu veux en fait)
    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pStr++; //fait pointer sur le 2eme caractere
    printf("%c",*pStr); // donne 'b'
    et d'ailleur j'ai testé, on peu tres bien faire pointer pStr vers une chaine qui n'est pas en lecture seulle, ca marche aussi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char *pStr="ha?"; // "ha?" est en lecture seule
    char x[5]="xyzt";
    pStr=x;
    pStr[0]='z'; // ca marche!!
    ca prouve bien que c'est uniquement la chaine "ha?" qui est en lecture seule.
    pStr n'est pas en lecture seule, ni intrinsequement ce vers quoi il pointe.

    voilà, c'est du pinaillage, je sais, mais bon...

    a+
    Quand Korta parlait d'espace memoire, il ne faisait pas refernce au pointeur mais a l'espace memoire contenant la chaine et pointe par pStr

  10. #10
    Membre actif
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Points : 207
    Points
    207
    Par défaut Re: Chaines et pointeurs mais pas "const"
    Citation Envoyé par gl
    Quand Korta parlait d'espace memoire, il ne faisait pas refernce au pointeur mais a l'espace memoire contenant la chaine et pointe par pStr
    J'ai le + grand respect pour ces indications, mais il faisait bien reference au pointeur :
    "un espace mémoire en lecture seule pointant vers la chaine constante"
    un truc pointant vers qqchose, j'appelle celà un pointeur.

    je sais je pinaille encore, c'est juste pour affiner l'information sur la page, je ne cherche pas les coups, mais c'est pour que l'information soit bien clair pour les visiteurs.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 03/04/2009, 13h09

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