Wie realisiere ich eine dynamische Liste mit Elementen dynamischer Länge?



  • Indem du mit malloc passend viele Bytes anforderst.



  • ;Athar schrieb:

    Indem du mit malloc passend viele Bytes anforderst.

    Aber von wo weiß ich, wie groß der Speicher für mein Struct sein muß, wenn der Text im Struct noch unbekannt ist?

    zeiger hilf;
    hilf = malloc(sizeof (struct liste));
    
    hilf->text = "1234567890qwertzuiopasdfghjkl";
    


  • das sind zwei paar schuhe - im struct selbst steht ja nur ein zeiger auf den text. speicher für text und listenelemente musst du getrennt mit malloc reservieren.

    ru,
    cirion



  • Oder man bedient sich einer Erweiterung aus C99 (flexible array members):

    struct liste {
        struct liste *next;
        char text[]; // das "flexible array member" muss das letzte Element der Struktur sein
    }
    
    // ...
    
    struct liste *new_element = malloc (sizeof *new_element + laenge_des_textes);
    

    Diese Variante hat allerdings ein paar Eigenheiten die man sich noch anlesen sollte, sollte man sie denn verwenden.



  • Danke an euch. Jetzt ist mir alles klar.

    Zu den flexiblen array members. Ist die Anzahl, an flexiblen array Members in einem Struct unbegrenzt oder gibt es hier Beschränkungen?



  • Prinzipbedingt kann es nur ein flexible array member pro struct geben. In deinem Fall würde ich ohnehin den klassischen Weg gehen.



  • Ich habe ein neues Problem, wenn ich versuche der Hilfsstruktur die Adresse der nächsten Struktur zu geben:

    hilf = (*hilf).next;
    

    Dann erhalte ich folgende Fehlermeldung:

    dynamische_liste.c:39: warning: assignment from incompatible pointer type



  • Problem schrieb:

    Ich habe ein neues Problem, wenn ich versuche der Hilfsstruktur die Adresse der nächsten Struktur zu geben:

    hilf = (*hilf).next;
    

    Dann erhalte ich folgende Fehlermeldung:

    dynamische_liste.c:39: warning: assignment from incompatible pointer type

    Das gleiche Problem habe ich, wenn ich folgendes schreibe:

    hilf = hilf->next;
    


  • Hab das Problem gefunden:

    // im Struct war:
    zeiger * next;
    
    // ja schon ein Zeiger, wesshalb es
    zeiger next;
    
    // heißen muß, damit geht es dann ohne Fehlermeldungen.
    


  • Dann habe ich noch eine Frage.

    Das erste Element in meiner Liste enthält ja die Anfangsadresse der Liste, die ja in einer extra Pointervariable vom Typ Zeiger gespeichert wird und sollte daher nicht ausversehen gelöscht werden.

    Kann man die irgendwie vorübergehend schützen, also so ne art const Pointer daraus machen, und später dann, wenn die Liste entgültig aus dem Speicher gelöscht werden soll, den Speicherschutz irgendwie entfernen?

    Const erzeugt ja leider AFAIK nur statische Schutzeinträge.


Anmelden zum Antworten