Avertissement lors de la conversion d’une chaîne const en char * lors de l’initialisation d’un tableau de chaînes C

J’avais l’habitude de faire ce qui suit pour déclarer et initialiser un tableau de chaîne en C:

char *myTable[] = { "ABC", "Y", "*", "*", "WXYZ", "Y", "*", "*", "MNO", "Y", "*", "*", NULL, NULL,NULL, NULL }; 

Les NULL sont à usage interne.

Depuis que j’ai migré vers la version 4.4.6 de gcc, je reçois un avertissement:

 abc.cpp:74: warning: deprecated conversion from ssortingng constant to 'char*' 

Quelle est la bonne façon d’initialiser mon tableau?

C’est parce que vous essayez de supprimer la constance de ces littéraux de chaîne et que le compilateur est suffisamment attentionné pour vous en avertir, car tenter de modifier la mémoire où ces littéraux de chaîne constants sont stockés conduit à un comportement indéfini [1]

Déclarez votre tableau en tant que const char *myTable[]


[1]: Norme C99: 6.7.8 Initialisation §32 :

la déclaration char *p = "abc"; définit p avec le type ” pointeur sur caractère ” et l’initialise pour pointer sur un object de type ” tableau de caractère ” de longueur 4 dont les éléments sont initialisés avec une chaîne de caractères Si vous tentez d’utiliser p pour modifier le contenu du tableau, le comportement n’est pas défini.

Essayez d’utiliser const char * au lieu de simplement char* .

C’est parce que les littéraux de chaîne sont constants, vous devez donc utiliser const char *myTable[] .

une chaîne qui ressemble à “hello world” est une constante de chaîne immuable. Vous devez déclarer

 const char *myTable[] = { "ABC", "Y", "*", "*", "WXYZ", "Y", "*", "*", "MNO", "Y", "*", "*", NULL, NULL,NULL, NULL };