I valori letterali stringa hanno il tipo appropriato const char[]

Aggiornamento: novembre 2007

I valori letterali stringa ora hanno il tipo const char [] e sono posizionati in una sezione della memoria di sola lettura. La modifica di tale memoria ora provocherà una violazione di accesso. Il codice compilato in versioni precedenti utilizzando /GF provocherà anche la violazione di accesso.

Il seguente esempio viene compilato ed eseguito in Visual Studio .NET, ma non funziona in fase di esecuzione in 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");
}

Inoltre, il comportamento in fase di esecuzione del codice, come quello del seguente esempio, è stato modificato:

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

Per risolvere questo errore, non passare i valori letterali stringa alle funzioni in cui verranno modificati.

Per il codice che sarà valido nelle versioni correnti e precedenti di Visual C++ nel caso in cui le funzioni siano sottoposte a overload in questo modo:

  • Eseguire il cast in modo esplicito di valori letterali stringa in const char*.

  • Definire le variabili sullo stack o l'heap.

Il seguente codice sarà valido nelle versioni di Visual Studio .NET 2003 e Visual Studio .NET di Visual C++ e non provocherà violazioni di accesso in nessuna di tali versioni:

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

Vedere anche

Riferimenti

Ultime modifiche al compilatore Visual C++