1. #1
    Membre du Club
    Profil pro
    Inscrit en
    juin 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2005
    Messages : 309
    Points : 61
    Points
    61

    Par défaut Les chaînes de caractères.

    Je lisais un des tutoriels sur developpez qui disait ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char s1[11] = "Developpez";
    char s2[] = "Developpez";
    char *s3 = "Developpez";

    La première méthode réserve une zone de 11 bytes et la chaîne "Developpez" y est stockée. La seconde méthode laisse le compilateur calculer la taille appropriée (11 bytes dans notre cas). La dernière méthode ne réserve pas de mémoire, elle se contente de stocker l'adresse d'une chaîne de caractères qui peut se trouver dans un endroit de la mémoire non modifiable par le programme, dans ce cas toute modification de la chaîne s3 se conclura par une erreur de segmentation.

    Pour la dernière déclaration, je me disais que c'était tout comme si on déclarait un tableau de char, ce qui n'est pas le cas ? Un tableau de char serait plutôt comme char* tab = {'a', 'b'}; ?

    Je viens de tester avec un petit exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int main(int argc, char *argv[])
    {
     
      char* s = "developpez";
     
      printf("%s\n", s);
     
      system("PAUSE");	
      return 0;
    }
    Si on lit l'énoncé cela dit: La dernière méthode ne réserve pas de mémoire, elle se contente de stocker l'adresse d'une chaîne de caractères qui peut se trouver dans un endroit de la mémoire non modifiable par le programme

    Comment se fait-il alors que cela m'affiche "developpez" à l'écran ? Il l'a quand même initialisé. Par contre on ne peut modifier la chaîne ça a planté.

    Et si j'essaie les 2 autres déclaration, cela ne fonctionne pas comme un pointeur de tableau ? J'ai essayé d'incrémenter s mais en vain.

    Conclusion, on peut faire un tableau de n'importe quoi dont on peut jouer avec le pointeur sauf le char ? Sauf si je fais un pointeur à part bien sûr, mais bon, c'est passer par 4 chemins selon moi.

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2003
    Messages : 4 506
    Points : 5 481
    Points
    5 481

    Par défaut

    Le dernier cas c'est que la zone ou est stockée la chaine qui est non modifiable donc tout accès en ecriture est voué a l'echec par contre en acces en lecture, avec le printf, cela ne pose pas de probléme.

    Il faut distinguer 3 types de mémoire dans un programme :

    -La mémoire automatique qui correspond à la zone où sont stockées les variables locales. On parle de pile.
    -La mémoire dynamique qui est tout ce que tu reserves comme mémoire avec les fonctions malloc/calloc/... On parle de tas(heap en anglais)
    -La mémoire statique où tu stockes les variables qualifiées de static, les variables globales et le troisieme cas que tu énonces.
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  3. #3
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    mai 2005
    Messages
    3 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : mai 2005
    Messages : 3 487
    Points : 5 332
    Points
    5 332

    Par défaut

    Les constantes chaînes de caractères sont en effet stockée en mémoire statique et ne sont pas modifiables. Ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char *s_mot = "Developpez";
    s_mot[0] = 'd'; /*Ici, on obtient une erreur, car il est interdit de modifier la
                            constante "Developpez" */
    Pour cette raison, il est recommandé de déclarer s_mot comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char const *s_mot = "Developpez";
    De cette manière, la constance de la chaîne "Developpez" est explicite. Notons encore, gcc avec l'option d'avertissement -Wwrite-string retournera un avertissement si un pointeur sur une constante chaîne de caractères n'est pas déclaré avec le qualificatif const.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    juin 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2005
    Messages : 309
    Points : 61
    Points
    61

    Par défaut

    Je comprends mieux maintenant, merci

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    26 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

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

    Informations forums :
    Inscription : septembre 2005
    Messages : 26 452
    Points : 38 115
    Points
    38 115

    Par défaut

    Juste une correction sur ce qu'a dit mujigka :
    L'option de GCC est -Wwrite-strings (notez le S)
    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.

  6. #6
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    mai 2005
    Messages
    3 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : mai 2005
    Messages : 3 487
    Points : 5 332
    Points
    5 332

    Par défaut

    Citation Envoyé par Médinoc
    Juste une correction sur ce qu'a dit mujigka :
    L'option de GCC est -Wwrite-strings (notez le S)
    Mille excuses

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

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

Discussions similaires

  1. [requète] travail sur les chaînes de caractères
    Par just xav dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 16/07/2007, 14h08
  2. fonctions qui convertit les chaînes de caractères en entier
    Par poyoland dans le forum PHP & MySQL
    Réponses: 8
    Dernier message: 02/03/2007, 11h36
  3. MFC + Manipuler les chaînes de caractères
    Par mqsi dans le forum MFC
    Réponses: 2
    Dernier message: 15/11/2006, 16h24
  4. Réponses: 6
    Dernier message: 08/08/2006, 09h14

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