Zeichenfolgenliterale haben den richtigen Typ const char[]

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

Siehe auch

Referenz

Wichtige Änderungen im Visual C++-Compiler