Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
String literals now have the type const char [] and are now placed in a read-only section of memory. Changing that memory will now cause an access violation. Code compiled in previous versions using /GF will also cause the access violation.
The following sample compiles and runs in Visual Studio .NET but will fail at run time 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");
}
In addition, the run-time behavior of code such as the following example has now changed:
// 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");
}
To resolve this error, do not pass string literals to functions where they will be modified.
For code that will be valid in the current and previous versions of Visual C++ in the case where functions are overloaded in this manner:
Explicitly cast string literals to const char*.
Define variables on the stack or the heap.
The following code will be valid in the Visual Studio .NET 2003 and Visual Studio .NET versions of Visual C++, causing an access violation in neither:
// 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);
}