String in char ** konvertieren



  • ScyllaIllciz schrieb:

    @krümelkackcker
    läuft hier auf 'nem Mac mit gcc 4.2.1 und 'nem Linux mit gcc 4.4.2.
    Aber Du hast natürlich Recht mit string*. Ich hatte gestern Abend viel ausprobiert und irgendwie ist das ein Überbleibsel gewesen!

    Du hast einfach Glück gehabt. Der C++ Standard definiert nicht, wie die string-Klasse genau implementiert werden soll. die libstdc++ Implementierung scheint äquivalent zu dem hier zu sein:

    class string
    {
      char* anfang; // <-- einziges Datenelement
    public:
      ...
    };
    
    int main() {
      string wtf = "hello!";
      wtf.reserve(80);
      string s2 = wtf;
      char* p = reinterpret_cast<char*&>(wtf);
    }
    

    und im Speicher sieht das dann so aus:

    p
                                                      |
                                                      V
    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    |       6       |      80       |       1       |'h'|'e'|'l'|'l'|'o'|'!'| 0 |
    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
         (size)        (capacity)     (ref_count-1)
    

    Wie gesagt, Du hast Glück gehabt, dass in deinem Fall sizeof(string)==sizeof(char*) gilt und dass der char-Zeiger direkt auf das erste Zeichen der nullterminierten Zeichenkette zeigt. Aus der Dokumentation im Quelltext geht hervor, dass man das so gemacht hat, damit man schön im Debugger sehen kann, was für eine Zeichenkette das string-Objekt speichert.

    Unter'm Microsoft Compiler ist sizeof(string) soweit ich weiß irgendwas bei 32 (wegen der "small string optimization").

    kk


Anmelden zum Antworten