String nachträglich ändern



  • Ich erhebe keinen Anspruch auf vollständigkeit/richtigkeit meines Codes, war im Editor runtergetippt. Aber Wutz, wenn du Ahnung hättest, würdest du wissen was pöse am =-operator ist, zumindest im Zusammenhang mit Characterpointern. Ich mache das jetzt 10 Jahre, und glaub mir es ist böse.

    Ich habe es oben schon erklärt und will mich eigentlich nicht wiederholen. Grund ist das für jedes Stringliteral Speicher reserviert wird, den du nicht wieder freigibst.

    Guck in ein C-Tutorial, da wirst Bestätigung finden.

    Grüße und schönen abend noch.



  • 2AndAHalfBit schrieb:

    Grund ist das für jedes Stringliteral Speicher reserviert wird, den du nicht wieder freigibst.

    1. Der Speicher wird auch "reserviert" wenn du mit strcpy arbeitest - oder was glaubst du wo kommt der zweite Parameter her? Magisch eingeflogen? 😃
    2. Klar wird der Speicher freigegeben oO



  • 2AndAHalfBit schrieb:

    Ich erhebe keinen Anspruch auf vollständigkeit/richtigkeit meines Codes, war im Editor runtergetippt. Aber Wutz, wenn du Ahnung hättest,...

    Mit deinem Pfusch, den du hier abgeliefert hast, der nicht nur häßlich sondern auch falsch ist, hast du dich und nicht ich mich desavouiert. Glaub mir, ich habe Ahnung und du nicht. Da helfen dir auch deine "schnell mal runtergetippt" Entschuldigungsversuche nicht, sowas würde mir selbst nach dem Genuss von 10 Seiten JW Pfusch unter Lachkrämpfen nicht passieren.



  • Was die Materie angeht, String-Literale haben statische Speicherdauer; sie bleiben für den Verlauf des Programms gültig und müssen nicht freigegeben werden. Der Standard ist hier erstaunlich konkret über das Verhalten des Compilers:

    ISO/IEC 9899:1999 6.4.5 (5) schrieb:

    In translation phase 7, a byte or code of value zero is appended to each multibyte character sequence that results from a string literal or literals. The multibyte character sequence is then used to initialize an array of static storage duration and length just sufficient to contain the sequence.

    Daraus folgt, dass an einer bestimmten Stelle im Code immer der gleiche Speicherbereich benutzt wird. Beispiel:

    char const *literal() {
      return "foo";
    }
    
    ...
    
    char const *p = literal();
    char const *q = literal();
    
    // Hier ist p == q
    

    Allerdings ist nicht definiert, ob alle String-Literale gleichen Inhalts vereinheitlicht werden. D.h.

    char const *p = "foo";
    char const *q = "foo";
    
    // Ob hier p == q ist, ist nicht definiert.
    

    Ansonsten: 2AndAAHalfBit: Von jemandem, der 10 Jahre C programmiert, sollte man erwarten dürfen, dass er das weiß. Hier besteht Nachholbedarf. Wutz: Ich habe schon schlimmeren Code von dir gesehen, und häufig auch trotz Berichtigungen mehrmals den selben. Dein Selbstvertrauen übersteigt deine Fähigkeiten bei weitem, und insbesondere mit Bemerkungen über hässlichen Code solltest du dich sehr zurückhalten.



  • Mit dem kleinen Unterschied, das du an dein String-Literal nicht mehr rankommst, weil du keine Referenz mehr darauf hast. Ist ja schön das der Compiler das optimiert, nützt nur nix. Nachholbedarf besteht bei mir wohl kaum, ich habe mit dem Thema abgeschlossen und damit ist fertig.

    Ich werde mich nun hier auch ausklinken. Ich wollte nur helfen, nur das ist ja wohl nicht möglich. Nagut eure Entscheidung.

    Schönenn Tag noch.



  • seldon schrieb:

    Allerdings ist nicht definiert, ob alle String-Literale gleichen Inhalts vereinheitlicht werden. D.h.

    C/C++ Code:
    char const *p = "foo";
    char const *q = "foo";
    
    // Ob hier p == q ist, ist nicht definiert.
    

    Dafür gibt es dann aber Compiler Switches die das regeln.



  • 2AndAHalfBit schrieb:

    Mit dem kleinen Unterschied, das du an dein String-Literal nicht mehr rankommst[...]

    Der Rückgabewert der Funktion literal() ist die Referenz auf das Literal. Da Du die Funktion immmer wieder aufrufen kannst, kommst Du auch immer wieder daran.

    2AndAHalfBit schrieb:

    [...]
    Je nachdem was eintritt zeigt dein Zeiger auf was anderes.
    Innerhalb einer Struktur z.B. kann das pöse enden. Dann liegen die Daten nämlich nicht mehr sequenziell hibntereinander sondern irgendwo im speicher.[...]

    Das endet nur dann böse, wenn man z.B. beim Serialisieren der Struktur naiv vorgeht. Beim Serialisieren sollte man aber niemals naiv vorgehen...



  • DirkB schrieb:

    seldon schrieb:

    Allerdings ist nicht definiert, ob alle String-Literale gleichen Inhalts vereinheitlicht werden. D.h.

    C/C++ Code:
    char const *p = "foo";
    char const *q = "foo";
    
    // Ob hier p == q ist, ist nicht definiert.
    

    Dafür gibt es dann aber Compiler Switches die das regeln.

    Das mag compiler- und linkerabhängig der Fall sein (es betrifft auch den Linker, wenn gleiche Literale in verschiedenen Übersetzungseinheiten benutzt werden). Vom C-Standard her kann man sich darauf allerdings nicht verlassen.



  • Ich habe nichts Anderes behauptet.

    Gäbe es Vorgaben vom Standard, wären die Switches auch überflüssig.



  • 2AndAHalfBit schrieb:

    Mit dem kleinen Unterschied, das du an dein String-Literal nicht mehr rankommst, weil du keine Referenz mehr darauf hast.

    Du hast zwar keine Referenz in einer Variablen mehr, aber im Code - egal ob der Compiler nun verschiedene Literale getrennt speichert oder zusammenfasst, wird er bei der Verwendung immer die (feste) Adresse dieses Literals verwenden.


Anmelden zum Antworten