Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Aktualisiert: November 2007
Zeichenfolgenliterale haben jetzt den Typ const char [] und werden in einem schreibgeschützten Speicherabschnitt abgelegt. Die Änderung dieses Speichers verursacht jetzt eine Zugriffsverletzung. Code, der in früheren Versionen mit /GF kompiliert wurde, führt ebenfalls zu einer Zugriffsverletzung.
Der folgende Beispielcode wird in Visual Studio .NET kompiliert und ausgeführt, verursacht in Visual Studio .NET 2003 jedoch zur Laufzeit einen Fehler:
// 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");
}
Außerdem hat sich das Laufzeitverhalten von Code jetzt wie im folgenden Beispiel geändert:
// 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");
}
Um diesen Fehler zu beheben, übergeben Sie keine Zeichenfolgenliterale an Funktionen, bei denen sie geändert werden.
Bei Code, der in der aktuellen und in früheren Versionen von Visual C++ in Fällen gültig ist, in denen Funktionen auf diese Weise überladen werden:
Wandeln Sie Zeichenfolgenliterale explizit in const char* um.
Definieren Sie Variablen auf dem Stapel oder Heap.
Der folgende Code ist sowohl in der Visual Studio .NET 2003-Version als auch in der Visual Studio .NET-Version von Visual C++ gültig und führt in keiner Version zu einer Zugriffsverletzung:
// 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);
}