Los literales de cadena tienen el tipo apropiado de const char[]
Actualización: noviembre 2007
Los literales de cadena tienen el tipo const char [] y se coloca ahora en una sección de sólo lectura de la memoria. Cualquier intento de cambiar esa memoria producirá una infracción de acceso. El código compilado en versiones anteriores mediante /GF también producirá una infracción de acceso.
El código de ejemplo siguiente se compila y se ejecuta en Visual Studio .NET, pero producirá errores en tiempo de compilación en 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");
}
Además, el comportamiento en tiempo de ejecución de código como el del ejemplo siguiente ha cambiado ahora:
// 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");
}
Para resolver este error, no pase literales de cadena a las funciones que pretendan modificarlos.
Para el código será válido en las versiones anteriores y actual de Visual C++ en el caso donde las funciones se sobrecargan de esta manera:
Convertir explícitamente los literales de cadena a const char*.
Definir variables en la pila o el montón.
El código siguiente será válido en las versiones de Visual C++ de Visual Studio .NET 2003 y Visual Studio .NET, no produciendo ninguna infracción de acceso en:
// 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);
}