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