Les littéraux de chaînes ont le type const char[] approprié
Mise à jour : novembre 2007
Les littéraux de chaîne ont maintenant le type const char [] et sont placés dans une section de mémoire en lecture seule. La modification de cette mémoire provoquera maintenant une violation d'accès. Le code compilé dans les versions antérieures utilisant /GF provoquera également la violation d'accès.
L'exemple suivant est compilé et s'exécute dans Visual Studio .NET mais échoue au moment de l'exécution dans Visual Studio .NET 2003 :
// bc_string_literals_have_proper_type_of_const_char.cpp
// compile with: /c
void f(char *c) {
c[0] = 'Q'; // Now gives run-time access violation
}
int main() {
f("TEST");
}
De plus, le comportement à l'exécution de code tel que l'exemple suivant a maintenant changé :
// bc_string_literals_have_proper_type_of_const_char2.cpp
#include "stdio.h"
void f(const char *) { // called in Visual Studio .NET 2003
printf_s("in f(const char *)\n");
}
void f(char *) { // called in Visual Studio .NET
printf_s("in f(char *)\n");
}
int main() {
f("TEST");
}
Pour résoudre cette erreur, ne passez pas de littéraux de chaîne aux fonctions où ils seront modifiés.
Pour le code qui sera valide dans les versions actuelles et antérieures de Visual C++ dans le cas où les fonctions sont surchargées de cette manière :
Effectuez un cast explicite de littéraux de chaîne en const char*.
Définissez des variables sur la pile ou le tas.
Le code suivant sera valide dans les versions Visual Studio .NET 2003 et Visual Studio .NET de Visual C++, sans provoquer de violation d'accès :
// bc_string_literals_have_proper_type_of_const_char3.cpp
#include <stdio.h>
void f(const char *psz) {
printf_s("const version\n");
}
void f(char *psz) {
printf_s("version where we modify it\n");
psz[0] = 'x';
}
int main() {
char myStr[] = "TEST";
f((const char*)"TEST");
f(myStr);
}