Strings



  • Hallo!

    Laut dem AOL C Tutorial kann man Strings auf diese beiden Arten erzeugen:

    /* String als Feld */  
    char zeichen [ ] = "hallo";
    
    oder 
    
    /* String als Zeiger */  
    char *zeichen = "hallo";
    

    Kann das schon stimmen? Version 1 erzeugt ein Array mit genügend Elementen. Das passt.
    Aber Version 2 erzeugt nur einen Pointer. Doch um den Speicher kümmert sich eigentlich keiner! Muss man für Version 2 nicht erst mal Speicher mittels malloc() reservieren?

    Grüße,
    Harri



  • Doch, das stimmt.
    Stell es dir so vor, dass der Compiler für den Text zwischen den " Speicher reserviert, die Buchstaben hineinkopiert und dann den neu erzeugten Pointer auf die Anfangsadresse setzt.

    Aber Achtung, laut Standard ist nur der Lesezugriff auf Stringliterale erlaubt.



  • OK, danke für die AW.

    Mehr als Lesezugriff brauche ich eh nicht für mein Programm.
    Mir ist halt nur aufgefallen dass das Programm größer wurde wenn ich den Text als char c[] verwendet habe.
    char *c ist interessanterweise viel kleiner!?

    Grüße,
    Harri



  • Kann an vielen Sachen liegen.

    Wie gesagt, darf sich der Compiler im 2. Fall aussuchen, wohin er den String steckt, solange der Pointer darauf zum Lesen gültig ist.
    So kann er natürlich besser optimieren, indem z.B. mehrere Programme sich die Speicherstelle teilen.

    Im ersten Fall (mit dem Array) muss uzsätzlich auch der Schreibzugriff gestattet sein.
    Vielleicht umkapselt er daher noch mit Bereichsprüfung oder Threadsicherheit oder sowas in der Art.



  • harry3 schrieb:

    Mir ist halt nur aufgefallen dass das Programm größer wurde wenn ich den Text als char c[] verwendet habe.
    char *c ist interessanterweise viel kleiner!?

    Das ist klar, schließlich muss sich das Programm im ersten Fall darum kümmern, dass Speicher reserviert wird und dann auch noch den String kopieren.

    Bei beiden ist es übrigens gleich, dass dein String schon in den Speicher geladen wird.
    Bei Version 1 wird der String dann, wie schon geschrieben, kopiert.
    Bei Version 2 zeigt einfach nur der Zeiger auf den Speicher, wo der String steht.
    Darum ist bei Version 2 das Schreiben auch untersagt, weil der String in einem Bereich steht, wo besser nichts verändert werden sollte, sonst verhielte sich dein Programm auf einmal recht seltsam ;).



  • SeppSchrot schrieb:

    Im ersten Fall (mit dem Array) muss uzsätzlich auch der Schreibzugriff gestattet sein.
    Vielleicht umkapselt er daher noch mit Bereichsprüfung oder Threadsicherheit oder sowas in der Art.

    Im ersten Fall wird ein Array angelegt, im zweiten Fall nur ein Zeiger, der natuerlich weniger Platz braucht, auf den ersten Blick. Der eigentliche Text wird im ersten Fall ins Datensegment (DATA) gelegt, im zweiten Fall ins konstante Datensegment (CDATA oder CONST DATA) oder gar ins Code-Segment (TEXT oder CODE).

    Je nachdem, welches Segment man nun anschaut, bekommt man unterschiedliche Ergebnisse der Segmentgroesse.

    Der Compiler macht uebrigens keine Kapselung von wegen Bereichspruefung und Threadsicherheit, das muss der Programmierer schon selber tun.

    Aus der Einfuehrung zum C Standard:

    ISO/IEC 9899:1999 schrieb:

    Keep the spirit of C. (...)

    • Trust the programmer.
    • Don't prevent the programmer from doing what needs to be done.
    • Keep the language small and simple.
    • Provide only one way to do an operation.
    • Make it fast, even if it is not guaranteed to be portable.

    C verlangt also nach einem "dummen" Compiler! 😉

    Der Standard erwaehnt auch an anderer Stelle, dass C so gestaltet wurde, dass es innerhalb eines C++ Systems verwendet werden kann, und dafuer muss es sich ohnehin auf das notwendigste beschraenken.

    C ist als Minimalsprache ausgelegt, so dass es moeglich ist, selbst fuer die kleinsten Systeme C Compiler zu schreiben (z.B. im Embedded-Bereich).



  • Hallo!

    Nochmals Danke für die AW's!
    Also wenn ich richtig geschnallt habe ist es so:
    Wenn als Array angelegt wird der String aus der Pogrammdatei extra nochmal in den Speicher kopiert.
    Wenn als Pointer angelegt zeigt der Zeiger auf die Adresse, wo der String in der Programmdatei selber gespeichert ist!?

    C ist als Minimalsprache ausgelegt, so dass es moeglich ist, selbst fuer die kleinsten Systeme C Compiler zu schreiben (z.B. im Embedded-Bereich).

    Ich programmiere auf dem Texas Instruments 200, ein etwas größerer Taschenrechner. Läuft mit dem bekannten Motorola 68000 mit 12Mhz.

    Grüße,
    Harri


Anmelden zum Antworten