const char* nach char*



  • Original erstellt von Dimah:
    **was ist jetzt besser
    c_str() + const_cast und COW fehler riskieren oder &s[0] und fehlende nullterminierung reskieren

    natürlich kann man beide probleme so lösen

    s[0]; // hoffe das der compilier troz seiteneffekt nicht wegoptimiert
    char * c = const_cast<char*>( s.c_str() );
    

    bzw.

    s.c_str(); // hoffe das der compilier troz seiteneffekt nicht wegoptimiert
    char * c = &s[0];
    ```**
    

    ich bin ja aus bereits genannten gründen für c_str()+const_cast. schreiben führt hier einfach zu undefiniertem verhalten. aber dessen ist man sich bewusst. der trick mit s[0]; führt immer noch zu undefiniertem verhalten, denn der compiler (bzw. seine lib) kann für c_str() auch eine kopie zurückliefern. die zweite problemlösung jedoch hilft denke ich gar nicht.



  • Original erstellt von Mr. N:
    aber dessen ist man sich bewusst. der trick mit s[0]; führt immer noch zu undefiniertem verhalten, denn der compiler (bzw. seine lib) kann für c_str() auch eine kopie zurückliefern.

    Auf jeden Fall wird er nur selten den Originalstring verändern, denn c_str ist als const festgelegt.



  • @Daniel E.: ich glaube nicht, dass du verstanden hast, was ich meine 🙄



  • @Mr. N: Ich glaube nicht, dass Du verstanden hast, was ich meine...

    Das was Du geschrieben hast war schon richtig. Dimah hat einen Denktfehler gemacht und behauptet, dass durch den Aufruf von s.c_str() der String s nachträglich nullterminiert wird. Dem kann nicht so sein, denn c_str hat keine Erlaubnisse, das Objekt zu verändern (oder dürfen alle Daten des Strings intern als mutable definiert sein?). Diese Einschränkung hattest Du nicht explizit genannt, sondern Du hattest explizit von der Implementierung abhängig gemacht (O-Ton: »er compiler (bzw. seine lib) kann für c_str() auch eine kopie zurückliefern«), dem ich (IMHO zurecht!) ist nicht so; Damit funktioniert Dimahs Lösung nicht. Prinzipiell kann man std::strings nicht eindeutig auf char-Zeichenketten abbilden. Alles klar?



  • und ich habe gemeint, dass c_str eine kopie liefern kann aber nicht muss, er also auf UB sich verlässt


Anmelden zum Antworten