30 votes

La conversion d'un littéral de chaîne de caractères en char* est dépréciée.

Je continue à obtenir l'erreur "Conversion from string literal to char* is deprecated" dans mon code. Le but de ce code est d'utiliser un pointeur à pointeur pour attribuer un mot à string1 et string2, puis de l'imprimer. Comment puis-je résoudre ce problème ?

Voici mon code :

#include <iostream>
using namespace std;

struct WORDBLOCK
{
    char* string1;
    char* string2;
};

void f3()
{
    WORDBLOCK word;

    word.string1 = "Test1";
    word.string2 = "Test2";

    char *test1 = word.string1;
    char *test2 = word.string2;

    char** teststrings;

    teststrings = &test1;
    *teststrings = test2;

    cout << "The first string is: "
         << teststrings
         << " and your second string is: "
         << *teststrings
         << endl;  
}

51voto

Keith Thompson Points 85120

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

Si vous voulez assigner 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 en tant que const char* et pas seulement comme char* .

Voici une version de votre code qui se compile sans avertissement :

#include <iostream>

using namespace std;

struct WORDBLOCK
{
    const char* string1;
    const char* string2;
};

void f3()
{
    WORDBLOCK word;

    word.string1 = "Test1";
    word.string2 = "Test2";

    const char *test1 = word.string1;
    const char *test2 = word.string2;

    const char** teststrings;

    teststrings = &test1;
    *teststrings = test2;

    cout << "The first string is: "
         << teststrings
         << " and your second string is: "
         << *teststrings
         << endl;
}

Considérez ce qui pourrait arriver si la langue n'a pas imposer cette restriction :

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

A (non const ) char* permet de modifier les données sur lesquelles pointe le pointeur. Si vous pouviez assigner un littéral de chaîne de caractères (implicitement converti en un pointeur vers le premier caractère de la chaîne) à un simple objet char* vous pourriez utiliser ce pointeur pour modifier la chaîne littérale sans que le compilateur n'émette d'avertissement. Le code invalide ci-dessus, si cela a fonctionné imprimerait

Some literal

-- et il pourrait même le faire sur certains systèmes. Sur mon système, cependant, il meurt avec une erreur de segmentation parce qu'il tente d'écrire dans une mémoire en lecture seule (pas la ROM physique, mais la mémoire qui a été marquée comme étant en lecture seule par le système d'exploitation).

(Une parenthèse : Les règles du C pour les chaînes littérales sont différentes de celles du C++. En C, un littéral de chaîne de caractères est un tableau de char , no un tableau de const char -- mais tenter de le modifier a un comportement non défini. Cela signifie qu'en C, vous pouvez légalement écrire char *s = "hello"; s[0] = 'H'; Le compilateur ne se plaindra pas nécessairement, mais le programme risque de mourir avec une erreur de segmentation lorsque vous l'exécuterez. Ceci a été fait pour maintenir une compatibilité descendante avec le code C écrit avant l'introduction de la norme const a été introduit. Le C++ avait const dès le début, donc ce compromis particulier n'était pas nécessaire).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X