La conversion de littéral de chaîne en char * est obsolète

L’erreur “Conversion de littéral de chaîne en char * est obsolète” continue à apparaître dans mon code. Le but du code est d’utiliser un pointeur à l’autre pour atsortingbuer un mot à ssortingng1 et ssortingng2, puis pour l’imprimer. Comment puis-je réparer cela?

Voici mon code:

#include  using namespace std; struct WORDBLOCK { char* ssortingng1; char* ssortingng2; }; void f3() { WORDBLOCK word; word.ssortingng1 = "Test1"; word.ssortingng2 = "Test2"; char *test1 = word.ssortingng1; char *test2 = word.ssortingng2; char** testssortingngs; testssortingngs = &test1; *testssortingngs = test2; cout << "The first string is: " << teststrings << " and your second string is: " << *teststrings << endl; } 

Les littéraux de chaîne C ++ sont des tableaux de caractères const , ce qui signifie que vous ne pouvez pas les modifier légalement.

Si vous souhaitez affecter en toute sécurité un littéral de chaîne à un pointeur (ce qui implique une conversion implicite de tableau à pointeur), vous devez déclarer le pointeur cible comme étant const char* , pas simplement char* .

Voici une version de votre code qui comstack sans avertissements:

 #include  using namespace std; struct WORDBLOCK { const char* ssortingng1; const char* ssortingng2; }; void f3() { WORDBLOCK word; word.ssortingng1 = "Test1"; word.ssortingng2 = "Test2"; const char *test1 = word.ssortingng1; const char *test2 = word.ssortingng2; const char** testssortingngs; testssortingngs = &test1; *testssortingngs = test2; cout << "The first string is: " << teststrings << " and your second string is: " << *teststrings << endl; } 

Considérez ce qui pourrait arriver si le langage n'imposait pas cette ressortingction

 #include  int main() { char *ptr = "some literal"; // This is invalid *ptr = 'S'; std::cout << ptr << "\n"; } 

Un caractère (non const ) char* vous permet de modifier les données pointées par le pointeur. Si vous pouviez affecter un littéral de chaîne (converti implicitement en un pointeur sur le premier caractère de la chaîne) à un caractère brut char* , vous pourrez utiliser ce pointeur pour modifier le littéral de chaîne sans avertissements du compilateur. Le code non valide ci-dessus, s'il fonctionnait , serait imprimé

 Some literal 

- et cela pourrait même le faire sur certains systèmes. Sur mon système, il meurt toutefois avec une erreur de segmentation car il tente d'écrire dans une mémoire en lecture seule (pas une mémoire physique, mais une mémoire marquée en lecture seule par le système d'exploitation).

(Un côté: les règles de C pour les littéraux de chaîne diffèrent des règles de C ++. En C, un littéral de chaîne est un tableau de caractères, pas un tableau de caractères const char , mais le fait de le modifier a un comportement indéfini. Cela signifie qu'en C peut légalement écrire char *s = "hello"; s[0] = 'H'; et le compilateur ne se plaindra pas nécessairement - mais le programme est susceptible de mourir avec une erreur de segmentation lorsque vous l'exécutez. Ceci a été fait maintenir la compatibilité avec le code C écrit avant l’introduction du mot-clé const . C ++ avait const dès le début, ce compromis n’était donc pas nécessaire.)