Zuweisung von String-Literal and Char-Pointer



  • Ohne gleich wieder hören zu wollen, dass es STL-Strings gibt (bitte! 😉 ):

    Wenn ich sowas mache:

    char *output;
    // [...]
    output = "Irgendein String";
    

    Dann ist das wahrscheinlich gar nicht gut, weil was überschrieben wird, oder? Ich habe mich nämlich gefragt, wie man am einfachsten Char-Arrays verschiedener Länge in ein und derselben Variable speichert. Wenn ich nämlich einen String mit 8 Zeichen und einen mit 40 Zeichen habe, dann kann ich den ja nicht in dieselbe Variable packen ohne entweder was abzuschneiden, oder Platz zu verschwenden, nicht?

    Außerdem stellte sich mir die Frage, wie man am besten Char-Arrays aus Funktionen zurückgibt. Wenn man da einfach wieder einen Char-Pointer zurübkgibt, dann muss man den ja anschließend in der aufrufenden Methode wieder löschen, um kein Speicherleck zu haben, soweit ich das nachvollziehe. Alternativ kann man natürlich auch by reference einfach ein Char-Array definierter Länge übergeben, das dann beschrieben wird. Aber da muss man dann zuerst noch dieses Array definieren, und außerdem kann es hier auch wieder zu Platzverschwendung kommen.

    Da gibt es doch sicherlich einen optimalen Weg (wie gesagt, außer STL-Strings, die bei solchen Fällen wahrscheinlich eigentlich vorzuziehen wären).



  • wenn output dazwischen etwas anderes zugewiesen wurde, dann verlierst du eben das, worauf es vor dieser zuweisung gezeigt hat.

    abgesehen davon wird es in std::strings wohl auch oft zu platzverschwendung kommen (schau dir mal capacity im vgl. zu size/length an)

    deshalb hat man meist auch irgendwo noch eine variable, die sagt, wie lang (=wieviel speicher) hinter dem char zeiger steckt. meist ist es gut, eine funktion aufzurufen, der man einen zeiger auf selbst allozierten speicher sowie die maximallänge gibt. bedarf, dann den speicher zu stutzen, sehe ich eigentlich nicht (in der regel).



  • David Schneider schrieb:

    Ohne gleich wieder hören zu wollen, dass es STL-Strings gibt (bitte! 😉 ):

    Wenn ich sowas mache:

    char *output;
    // [...]
    output = "Irgendein String";
    

    Dann ist das wahrscheinlich gar nicht gut, weil was überschrieben wird, oder?
    ...

    Das ist nicht nur schlecht, sondern auch absolut fehlerhaft.
    1. output ist bei dir ein char-Pointer, kein char-Array, es sei den du machst noch in den Auskommentierten Bereich eine entsprechende Speicheralloziierung (und denkst auch daran den Speicher wieder frei zu geben).
    2. Kannst du einem Array nicht einen String zuweisen, dazu benötigst du entsprechende Funktionsaufrufe um es hinein zu kopieren.
    (Nachtrag: Ausnahme sind natürlich konstante Zeichenketten, nur macht du hier keine Initialisierung sondern eine Zuweisung)

    Und ganz ehrlich: Wenn du schon so masochistisch bist mit char* arbeiten willst, ohne die absoluten Grundlagen zu beherrschen, solltest du doch wohl noch in der Lage sein dir ein Tutorial oder ähnliches zu suchen, wo du zumindestens die ersten Schritte nachlesen kannst. Und ja, nenn mir einen wirklich guten Grund der gegen std::string spricht.

    cu André



  • David Schneider schrieb:

    Ohne gleich wieder hören zu wollen, dass es STL-Strings gibt (bitte! 😉 ):..

    Benutze STL-Strings !!! :p 😉

    Mal ehrlich: Wenn Du wirklich etwas über Zeiger lernen willst, nimm Dir Beispiele mit Zeigern auf int oder MyClass ... das C-String-Gefrickel sieht oft einfach aus, bedeutet aber was ganz Anderes als man auf den ersten Blick meint.

    Gruß,

    Simon2.


Anmelden zum Antworten