Frage

Ich versuche, einige klassische C-Entwicklung in Visual C ++ 2008 zu tun, dass die Zeichen einer Zeichenkette wie so ändern wird:

void ModifyString(char *input)
{
  // Change first character to 'a'
  *input = 'a';
}

Ich erhalte eine nicht behandelte Ausnahme, wenn ich versuche, ein Zeichen zu ändern. Es scheint, wie ich das in Visual Studio 6 oder mit gcc tun könnte, aber vielleicht bin ich nur etwas zu vergessen. Hindurchgeht Visual Studio irgendwie char * nach Wert (Speicherverwaltung). Wenn ja, wie das ich abschalten?

War es hilfreich?

Lösung

Du bist wahrscheinlich ein Stringliteral irgendwo vorbei:

ModifyString("oops");  // ERROR!

C und C ++ können Sie implizit aus Stringliterale geworfen (die Art const char[] haben) char*, aber eine solche Verwendung ist veraltet. String-Konstanten sind erlaubt im schreibgeschützten Speicher zugewiesen werden (und sie sind in der Regel), so dass, wenn Sie versuchen, sie zu ändern, werden Sie eine Zugriffsverletzung erhalten (auch bekannt als Segmentierungsfehler oder Bus-Fehler). Wenn die Compiler keine String-Konstanten in Nur-Lese-Speicher setzt, wird das Programm immer noch funktionieren, aber es ist nicht definiertes Verhalten.

Der richtige Weg, dies zu tun, ist die Zeichenfolge in einen beschreibbaren Puffer zu kopieren:

// one way:
char mystring[] = "test";
ModifyString(mystring);  // ok

// another way:
char mystring[64];  // make sure this is big enough!!
strcpy(mystring, "test");
ModifyString(mystring);  // ok

Andere Tipps

Ist die Eingabe ein Stringliteral? Das ist wahrscheinlich das Problem. Andernfalls müssen Sie mehr Code schreiben, wie der Zeiger irgendwie in einer Nur-Lese-Stelle im Speicher am Ende hat zeigen.

Es ist unmöglich, diese Frage zu beantworten, ohne zu sehen, wie ModifyString genannt wird. Die Funktion selbst ist richtig, es ist Vertrag unter der Annahme ist einen nicht-NULL-Wert übergeben werden.

Es ist jedoch möglich, dass der Anruf Website, indem Sie eine beliebige Anzahl von Dingen zu scheitern

  • Passing NULL
  • Passing const char mittels eines bösen Guss

Ich kann nicht genau sagen, warum dies nicht funktioniert, aber das Problem ist in Ihrem Code nicht Visual Studio. Aus irgendeinem Grund sind vorbei Sie einen ungültigen Zeiger auf die Funktion. Es ist entweder ein Null-Zeiger, oder er zeigt einige Adresse, die Sie keinen Zugriff auf gelesen haben.

Wenn Sie etwas mehr von dem Code (wo ist die Funktion aufgerufen aus, und wie heißt es?), Wir in der Lage sein können, das genaue Problem hinweisen.

Der Grund ist es in GCC oder VC6 gearbeitet ist ganz einfach, dass es nicht definiertes Verhalten ist. Die C ++ Standard nicht sagen, dass „dies sollte funktionieren“ oder „soll dies zu einem Absturz führen“. Alles kann passieren, wenn Sie in den Speicher schreiben Sie haben keinen Zugang zu. Und je nach Compiler und das System Sie die Anwendung laufen auf, die Adresse, die Sie zugreifenden am Ende variiert. Durch pures Glück, treffen Sie eine Adresse, die eine Zugriffsverletzung verursacht, wenn mit VC2008 zusammengestellt. Unter GCC und VC6, waren Sie nicht so viel Glück und bekamen Code, der erschien zu arbeiten und einfach schrieben an einige Müll-Adresse.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top