Compartir a través de


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);
}

Vea también

Referencia

Cambios importantes en el compilador de Visual C++