String in Struct



  • Hallo, ich möchte einen einfachen String in eine Struktur speichern und dann ausgeben. Und so mach ich es:

    #include <stdio.h>
    #include <stdlib.h>
    
    struct Haus {
    	char strasse[20];
    };
    
    int main(void) {
    
    	struct Haus *ptrHaus;
    
            ptrHaus = (struct Haus *) malloc(sizeof(struct Haus));
            *ptrHaus->strasse = "Waldweg";
    
    	printf("%s", ptrHaus->strasse);
    }
    

    Ich bekomme am Ende aber nicht die Ausgabe "Waldweg", sondern irgendwelche anderen Zeichen ("d(f" oder sowas).
    Warum krieg ich so eine Ausgabe?



  • ptrHaus->strasse = "Waldweg"; muss es heißen.



  • Du kannst in diesem Fall (und nur in diesem Fall, wo nur das erste Strukturelement interessant ist) die imlizite Struktur-Inhalt-Kopie bei Zuweisung ausnutzen, um z.B. das strcpy einzusparen:

    *ptrHaus = *(struct Haus *)"Waldweg";
    


  • 314159265358979 schrieb:

    ptrHaus->strasse = "Waldweg"; muss es heißen.
    

    Das ist natürlich Schrott, sollte schon rein von der Syntax her nicht funktionieren.



  • Es bliebe noch die Zeiger-Kopie Variante übrig (ohne Inhalts-Kopie):

    struct Haus {
        char *strasse;
    };
    
    int main(void) {
    
        struct Haus *ptrHaus;
    
            ptrHaus = (struct Haus *) malloc(sizeof(struct Haus));
            ptrHaus->strasse = "Waldweg";
    
        printf("%s", ptrHaus->strasse);
    }
    


  • Du wolltest statt *ptrHaus->strasse = "Waldweg";

    strcpy(ptrHaus->strasse,"Waldweg");
    

    schreiben.



  • Sorry, Leute!
    Diesen Beitrag bitte löschen. Hab mich vertan!



  • Wutz schrieb:

    Es bliebe noch die Zeiger-Kopie Variante übrig (ohne Inhalts-Kopie):

    struct Haus {
        char *strasse;
    };
    //(...)
    

    Das ist mir bekannt, danke dennoch. Meine Frage ist viel mehr die, wie oben formuliert: Warum krieg ich so eine kryptische Ausgabe? Soll das die Speicheradresse darstellen, die ich statt meinem String bekomme?



  • Folgendes:

    *ptrHaus->strasse = "Waldweg";
    

    kann man auch

    ptrHaus->strasse[0] = "Waldweg";
    

    schreiben. Du fängst an mit einem uninitialisierten Buffer, der mit einiger Wahrscheinlichkeit wenige bis keine Null-Bytes enthält, die ein Stringende darstellten, und ersetzt dessen erstes Byte durch das niederwertigste Byte der Speicheradresse von "Waldweg". Wenn du das Ergebnis als String ausgibst, wird das erste ausgegebene Zeichen das genannte niederwertigste Byte der Speicheradresse von "Waldweg" sein, der Rest das, was zufällig zur Allokationszeit im uninitialisierten Buffer stand - oder auch dahinter, abhängig davon, wie schnell ein Null-Byte gefunden wird. Sowas kann auch einen Segfault auslösen.

    Im Übrigen tötet der Gott der Programmierung jedes mal, wenn ein String-Literal einem char* zugewiesen wird, ein niedliches Kätzchen auf unnötig grausame Weise. const!



  • seldon schrieb:

    ...
    Im Übrigen tötet der Gott der Programmierung jedes mal, wenn ein String-Literal einem char* zugewiesen wird, ein niedliches Kätzchen auf unnötig grausame Weise. const!

    und in dem Kadaver werden dann Millionen Bugs ausgebrütet die sich über die Computer hermachen.



  • Pimeys schrieb:

    Meine Frage ist viel mehr die, wie oben formuliert: Warum krieg ich so eine kryptische Ausgabe? Soll das die Speicheradresse darstellen, die ich statt meinem String bekomme?

    Deine kryptische Ausgabe entspricht der String-Interpretierung der Adresse von "Waldweg", auf 32-Bit Systemen also typischerweise genau 4 char.



  • Ich danke euch! Und ja, ich will tierlieb sein, ich mag Kätzchen 😃


Anmelden zum Antworten