J'ai le code suivant:Pourquoi cette simple affectation de chaîne segfault?
#include <iostream>
using namespace std;
int main()
{
char* a = "foo";
char* b = "bar";
a = b;
cout << a << ", " << b << endl;
return 0;
}
Ceci compile et fonctionne, par exemple. imprime bar,
bar
. Maintenant, je voudrais démontrer que ce qui se passe ici ne copie pas une chaîne. Je voudrais changer b
et montrer que a
change également. Je suis venu avec ce code simple:
#include <iostream>
using namespace std;
int main()
{
char* a = "foo";
char* b = "bar";
a = b;
b[1] = 'u'; // ← just this line added
cout << a << ", " << b << endl;
return 0;
}
... mais il se sépare. Pourquoi? La chose intéressante est que la modification suivante fonctionne très bien:
#include <iostream>
using namespace std;
int main()
{
char* a = "foo";
char b[] = "bar"; // ← declaration changed here
a = b;
b[1] = 'u';
cout << a << ", " << b << endl;
return 0;
}
Pourquoi ne pas segfault comme le précédent? Je suppose qu'il me manque une différence importante entre le style pointeur et l'initialisation de chaîne de style tableau.
Notez également que votre code donne des avertissements du compilateur qui expliquent ce problème: « Avertissement: conversion dépréciée de constante chaîne « char * » » – schnaader
g ++ -Wall -pedantic 4.01 n'a pas, que dois-je allumer pour obtenir l'avertissement? – zoul
Utilisation de g ++ 4.3.2 ici sur Debian, les paramètres n'ont pas d'importance, il suffit d'appeler "g ++ test.cpp", ajouter -Wall, -pedantic ou les deux ne change rien. Il semble que cet avertissement ait été ajouté quelque part après 4.1/4.2. – schnaader