Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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);
}