Partilhar via


Seqüência de caracteres literais com tipo correto de const char]

Literais de seqüências de caracteres agora tem o tipo [const] char e agora são colocados em uma seção somente leitura de memória.Alterar o que a memória agora causará uma violação de acesso.Código compilado em versões anteriores usando /GF também fará com que a violação de acesso.

O exemplo a seguir compila e executa no Visual Studio. NET, mas falha em time de execução no 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");
}

Além disso, o comportamento em time de execução do código sistema autônomo o exemplo a seguir agora foi alterado:

// 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 esse erro, não passe literais da cadeia de caracteres para funções onde eles serão modificados.

Para código que será válido nas versões corrente e anteriores do Visual C++ no caso onde funções estão sobrecarregadas desta maneira:

  • Converter os literais da cadeia de caracteres para const char * explicitamente.

  • Defina variáveis em pilha ou heap.

O código a seguir será válido nas versões do Visual C++, fazendo com que uma violação de acesso em nenhuma Visual Studio .NET 2003 e o Visual Studio. NET:

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

Consulte também

Referência

Alterações significativas no compilador Visual C++