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).