Betrachten Sie den folgenden Code ein:Konvertieren von std :: string ** in char *** und es funktioniert. Wie?
std::vector<std::string> foo{{"blee"}, {"bleck"}, {"blah0000000000000000000000000000000000000000000000000000000000000000000000000000000000"}};
std::string *temp = foo.data();
char*** bar = reinterpret_cast<char***>(&temp);
for (size_t i = 0; i < foo.size(); ++i){
std::cout << (*bar)[i] << std::endl;
}
Klar ist das skizzenhafte Code, aber es passiert zu arbeiten.
würde Ich mag wissen, warum es funktioniert? Gibt es einige seltsame Regeln von C++, von denen ich nichts weiß? Oder ist es nur schlechter Code und undefiniertes Verhalten?
Ich machte eine der Saiten sehr groß für den Fall, dass es eine kleine String-Optimierung gab.
Übernommen aus: Cast a vector of std::string to char***
Es ist möglich, dass der String den Zeiger auf seinen Puffer als erstes Strukturelement speichert, daher ist seine Adresse dieselbe wie die des Stringobjekts. Ich würde nicht sagen "es funktioniert"; Es ist eher * vorgeben * zu arbeiten. –
@TheParamagneticCroissant ja ich wette auch darauf, aber ich glaube nicht, dass es eine gute Idee ist, sich auf das Erstellen von Code zu verlassen, der immer funktionieren sollte ... –
Ich denke, es hat mit std :: vector behaviour zu tun. Es ** garantiert ** kontinuierliches Gedächtnis und sogar kopiert und bewegt seine Daten herum, um diese Garantie zu erfüllen. Wenn sie statische std :: strings mit fester Speichergröße bekommen, werden sie in einen fortlaufenden Speicherblock gestellt und Sie können Tricks wie diesen machen :). Um es zu überprüfen, können Sie eine andere Zeichenfolge in Ihrem Vektor drücken und sehen, ob Ihre vorherigen Datenzeiger noch gültig sind. – Amadeusz