Frage

Ich bin mit konstanten Zeigern in C++ verwirrt und habe eine kleine Anwendung geschrieben, um zu sehen, wie die Ausgabe aussehen würde.Ich versuche (glaube ich), einen Zeiger auf eine Zeichenfolge hinzuzufügen, was nicht richtig funktionieren sollte, aber wenn ich das Programm ausführe, erhalte ich korrekt „Hallo Welt“.Kann mir jemand helfen herauszufinden, wie diese Zeile (s += s2) funktioniert?

Mein Code:

#include <iostream>
#include <stdio.h>
#include <string>

using namespace std;

const char* append(const char* s1, const char* s2){
    std::string s(s1);     //this will copy the characters in s1
    s += s2;               //add s and s2, store the result in s (shouldn't work?)
    return s.c_str();      //return result to be printed
}

int main() {
    const char* total = append("hello", "world");
    printf("%s", total);
    return 0;
}
War es hilfreich?

Lösung

Die Variable s ist lokal innerhalb der append Funktion.Sobald die append Die Funktion gibt zurück, dass die Variable zerstört ist, sodass Sie einen Zeiger auf eine Zeichenfolge haben, die nicht mehr existiert.Die Verwendung dieses Zeigers führt zu undefiniertes Verhalten.

Mein Tipp an Sie, wie Sie das Problem lösen können:Verwenden std::string den ganzen Weg!

Andere Tipps

du fügst hinzu const char* Zeiger auf a std::string und das ist möglich (siehe diese Referenz).Es wäre nicht möglich, diese Operation durchzuführen char* Typ (Zeichenfolge im C-Stil).

Sie geben jedoch einen Zeiger auf eine lokale Variable zurück, also eine einmalige Funktion append zurückkehrt und vom Stapel entfernt wird, wäre die Zeichenfolge, auf die Ihr zurückgegebener Zeiger zeigt, nicht vorhanden.Dies führt zu einem undefinierten Verhalten.

Die Klasse std::string ist überlastet operator += für einen Operanden vom Typ const char *

basic_string& operator+=(const charT* s);

Tatsächlich hängt es einfach die Zeichenfolge, auf die dieser Zeiger zeigt, an den Inhalt des Objekts vom Typ std::string an und reserviert bei Bedarf zusätzlichen Speicher.Beispielsweise könnte der überladene Operator intern die Standard-C-Funktion verwenden strcatVom Konzept her ähnelt es dem folgenden Codeausschnitt.

char s[12] = "Hello ";
const char *s2 = "World";

std::strcat( s, s2 );

Berücksichtigen Sie, dass Ihr Programm undefiniertes Verhalten aufweist, weil total wird ungültig, nachdem lokale Objekte nach Beenden der Append-Funktion zerstört wurden.Also die nächste Haupterklärung

printf("%s", total);

kann zu undefiniertem Verhalten führen.

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