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 :

Constante chaîne de caractères


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 73
    Par défaut Constante chaîne de caractères
    Bonjour à tous,

    Voilà, le doute m'habite sur l'utilisation de const appliqué à une chaîne de caractère.

    Je voudrais, en fait, être certain que la chaîne de caractère wrd ne puisse pas être modifée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdlib.h>
    #include <stdio.h>
     
    int
    main(void)
    {
    	static const char const* wrd = "La tête à Toto";
     
    	printf("%s\n", wrd);
     
    	return EXIT_SUCCESS;
    }
    Sommes-nous bien d'accord, ni la zone mémoire référencée par le pointeur ni la variable wrd ne pourront être modifiés, j'ai bon ou pas ?

    Y en a pas de trop là...?

    Merci.

  2. #2
    Membre très actif

    Inscrit en
    Juillet 2008
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 186
    Par défaut
    Bonjour,

    Si, si il y en a de trop. Dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static const char const *wrd = "La tête à Toto";
    les deux const s'appliquent à char. L'un des deux est en trop.

    Pour que le pointeur soit constant, il faut ajouter un const après l'étoile. Au final donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static char const * const wrd = "La tête à Toto";
    aura bien à la fois les caractères et le pointeur constants.

    De manière générale, const s'applique toujours à ce qui se trouve à sa gauche. (C'est pour cela que j'écris 'char const' et non pas 'const char'. Mais les deux sont strictement équivalents.)

    Didier

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 73
    Par défaut
    Merci Didier.

    Effectivement, maintenant que tu le dis (c'est toujours plus facile quand on a LA réponse, hein...), dans mon exemple, mes deux const s'appliquent effectivement à char.

    Ben oui, puisque le Monsieur te le dit...! lol:

    Question subsidiaire: me faut-il libérer la zone mémoire pointé par mon pointeur de caractères ?

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Bonsoir,
    Citation Envoyé par A&N_L Voir le message
    Question subsidiaire: me faut-il libérer la zone mémoire pointé par mon pointeur de caractères ?
    Non.
    Il ne faut libérer que la mémoire qu'on alloue soit même explicitement.

  5. #5
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    J'en profite pour partager un "truc" que j'ai découvert aujourd'hui avec mon problème de const et de pointeurs de pointeurs.

    Il est en fait très simple de savoir ce qui est constant dans un type contenant des "const" : c'est tout ce qui suit le "const".

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    T const * v;   /*   *v est constant  */
    T * const v;   /*    v est constant  */
    T const * * v; /*  **v est constant  */
    T * const * v; /*   *v est constant  */
    T * * const v; /*    v est constant  */
    Et toutes le combinaisons sont bien sûr possibles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T const * const * v; /*  *v et **v sont constants  */
    Le seul truc qu'il faut savoir en plus, c'est que const T * v est aussi une syntaxe valide qui a le même sens que T const * v.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 73
    Par défaut
    Citation Envoyé par matafan Voir le message
    J'en profite pour partager un "truc" que j'ai découvert aujourd'hui avec mon problème de const et de pointeurs de pointeurs.

    Il est en fait très simple de savoir ce qui est constant dans un type contenant des "const" : c'est tout ce qui suit le "const".

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    T const * v;   /*   *v est constant  */
    T * const v;   /*    v est constant  */
    T const * * v; /*  **v est constant  */
    T * const * v; /*   *v est constant  */
    T * * const v; /*    v est constant  */
    Et toutes le combinaisons sont bien sûr possibles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T const * const * v; /*  *v et **v sont constants  */
    Le seul truc qu'il faut savoir en plus, c'est que const T * v est aussi une syntaxe valide qui a le même sens que T const * v.
    Merci à toi matafan, suis certain qu'en plus de ma pomme ta découverte va en aider plus d'un à y voir plus (un peu) clair avec const.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 73
    Par défaut
    Citation Envoyé par mabu Voir le message
    Bonsoir,

    Non.
    Il ne faut libérer que la mémoire qu'on alloue soit même explicitement.
    Aïe... Et là, c'est le drame...
    Comment faire la distinction/quelle différence y a-t-il entre une zone mémoire allouée explicitement et celle (si j'ai bien saisi la nuance...) alloué implicitement (c'est bien ça la nuance ?) ?

    Si tu as éventuellement un petit bout de code, cela m'aidera certainement à éclairer ma lanterne...

    Merci.

  8. #8
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Tu dois "savoir" comment la mémoire a été allouée, et la libérer en conséquence si besoin. En général çe ne pose pas trop de problème : c'est toi qui fait les allocations, donc tu sais si elle a été alouée ou non.

    C'est tout l'art de la programmation en C : libérer tout ce qui a été aloué dynamiquement, mais pas plus, et sans libérer deux fois la même chose

    Edit : alloué dynamiquement, ça veut dire allouée avec un malloc() (ou équivalent : realloc(), strdup()...). Ce n'est pas le cas de ta chaine dans cet exemple. Ta chaine est dans les données statiques du programme. En fait elle n'est pas vraiment "allouée". Elle existe dès le chargement du programme.

  9. #9
    Invité(e)
    Invité(e)
    Par défaut
    On alloue de la mémoire explicitement quand on appelle malloc, calloc ou realloc... ou strdup. Liste non-exhaustive je pense...

    Voir ce man.

    On libère la mémoire allouée par une de ces fonction par free.

    Quand on travaille avec un tableau statique, de la mémoire est bien allouée, mais c'est le travail de compilateur de s'en occuper.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int tableau_statique[5];
     
    int * tableau_dynamique;
    tableau_dynamique = malloc(5 * sizeof * tableau_dynamique);
     
    /* traitement sur le tableau, à commencer que malloc a bien fonctionné. */
    /* ... */
     
    free(tableau_dynamique);

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par A&N_L Voir le message
    Aïe... Et là, c'est le drame...
    Comment faire la distinction/quelle différence y a-t-il entre une zone mémoire allouée explicitement et celle (si j'ai bien saisi la nuance...) alloué implicitement (c'est bien ça la nuance ?) ?
    C'est à toi de 'prendre des notes' (structures, flags, toussa...). Dans doute, tout allouer, tout libérer.

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Constante chaîne de caractères et fonction
    Par Deudvid dans le forum C
    Réponses: 1
    Dernier message: 11/10/2010, 18h01
  3. Hachage sans collision sur un ensemble limité et constant de chaîne de caractères.
    Par Benoit_T dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 22/02/2010, 17h27
  4. Inverser une chaîne de caractères
    Par DBBB dans le forum Assembleur
    Réponses: 2
    Dernier message: 30/03/2003, 11h09
  5. Réponses: 3
    Dernier message: 09/05/2002, 01h39

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