Hinzufügen eines Zeigers auf einen String in C++
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;
}
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 strcat
Vom 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.