Pourquoi changer la valeur d'une variable const char*?

pourquoi le code suivant en C fonctionne-t-il?

const char* str = NULL;
str = "test";
str = "test2";

puisque str est un pointeur vers un caractère constant, pourquoi sommes-nous autorisés à lui assigner des caractères littéraux différents? En outre, Comment Pouvons-nous empêcher que des DOD soient modifiées? Il semble que cela pourrait être un problème si, par exemple, nous assignions plus tard str à une chaîne plus longue qui a fini par écrire sur une autre partie de la mémoire.

je devrais ajouter que dans mon test, j'ai imprimé l'adresse de mémoire de str avant et après chacune de mes missions et il n'a jamais changé. Donc, bien que str soit un pointeur vers un char de const, la mémoire est en fait en train d'être modifiée. Je me demande si c'est peut-être un problème d'héritage avec C?

20
demandé sur MaxVT 2009-01-13 22:09:30

6 réponses

vous changez le pointeur, qui n'est pas const (la chose qu'il pointe est const).

si vous voulez que le pointeur lui-même soit const, la déclaration ressemblerait à:

char * const str = "something";

ou

char const * const str = "something";  // a const pointer to const char
const char * const str = "something";  //    same thing

Const les pointeurs vers des données non const sont généralement moins utiles que les pointeurs vers const.

34
répondu Michael Burr 2009-01-13 19:13:08

en outre, Comment Pouvons-nous protéger str d'être modifié?

char * const str1; // str1 cannot be modified, but the character pointed to can
const char * str2; // str1 can be modified, but the character pointed to cannot
const char * const str3 // neither str3 nor the character pointed to can be modified.

la façon la plus facile de lire ceci est de commencer par le nom de la variable et de lire à gauche:

  • str1 est un const ant pointeur à un char acter
  • str2 est un pointeur à un char acter const ant
  • str3 est un const ant pointeur à un char acter const ant

NOTE: la lecture de droite à gauche ne fonctionne pas dans le cas général, mais pour les déclarations simples, c'est une façon simple de le faire. J'ai trouvé un Java applet basé sur le code du "langage de programmation C" qui peut déchiffrer des déclarations avec une explication complète de la façon de le faire.

13
répondu Matthew Crumley 2009-01-13 19:44:30

Sur une note connexe, certainement prendre un coup d'oeil à " const pointeur contre pointeur const ". Il aide avec ce que certaines personnes appellent const rectitude . Je le garde dans mes signets pour pouvoir y faire référence de temps en temps.

2
répondu 2 revsAnthony Cuozzo 2009-08-05 10:02:55

Ce que vous cherchez peut-être la syntaxe...

const char* const str = NULL;
str = "test";
str = "test2";

remarquez le" const " après le char* qui produit une erreur de compilateur en essayant de compiler/compiler.

1
répondu Rob Segal 2009-01-13 19:18:06

mémoire pour la chaîne de caractères littéraux sont alloués sur la pile, et toutes vos tâches ne sont de changer le pointeur str pointer vers ces adresses mémoire. Le caractère constant qu'il indiquait initialement n'a pas changé du tout.

1
répondu Joel Coehoorn 2009-01-13 19:18:40

de plus, déclarer une variable comme const signifie que la variable est en lecture seule; cela ne signifie pas que la valeur est constante!

1
répondu Kieran Tully 2009-01-13 19:41:51