dynamische Länge "Vektoren von Strukturen"



  • Hallo Leute,
    bin neu hier und versuche mich gerade ein wenig in C.

    Ich habe folgendes Problem und weiß nicht recht wie ich das anfangen soll.
    Ich habe mir ein struct angelegt und diese als ein "Vektor von Strukturen" deklariert. Nun ist dieser Vektor aber statisch an die 200 gebunden (siehe unten). Wie kann man das dynimsch ein richten? Und geht das überhaupt?
    Die 200 sollte schon minimum sein, aber eben auch mehr möglich sein. Hab ein wenig rum probiert (calloc() und realloc()), aber nicht wirklich viel hin bekommen. Habt Ihr ein paar Anreize/Ideen?

    Viele Dank schon einmal^^

    #define SIZE_A 200
    #define SIZE_B 100

    struct indexinhalt{
    char begriff[30];
    char datei[SIZE_B][30];
    int anzahl_dateien;
    int position[SIZE_B];
    };

    struct indexinhalt indexstruktur[SIZE_A]



  • struct indexinhalt *indexstruktur = malloc(anzahl * sizeof(struct indexinhalt));

    ?



  • Dafür gibt es malloc:

    struct indexinhalt *create_struktur(int num) {
        struct indexinhalt *ret = malloc(num * sizeof(*ret));
    
        // hier kannst du noch ret initialisieren
    
        return ret;
    }
    
    int main(void) {
        struct indexinhalt *struktur = NULL;
    
        struktur = create_struktur(300);
    
        return 0;
    }
    

    Solltest du dann ein größeres Array brauchen, kannst du mit realloc()
    dir einen entsprechend größeren Speicherbereich anlegen.
    Oder du verwendest malloc() wieder und kopierst die bisherigen Daten
    mit memcpy() ins neue Array. Mit free() kannst du den Speicher wieder
    freigeben.

    Gruß mcr

    PS: liest dir mal ein gutes Einsteiger-Buch durch.



  • oder du benutzt malloc und kopierst die zeiger des vorherigen strukturblocks, wenn du die vorherigen strukturinhalte behalten willst.
    so wird für jede struktur nur ein zeiger kopiert, egal wie gross diese ist.



  • a?b°c! schrieb:

    oder du benutzt malloc und kopierst die zeiger des vorherigen strukturblocks, wenn du die vorherigen strukturinhalte behalten willst.
    so wird für jede struktur nur ein zeiger kopiert, egal wie gross diese ist.

    Das setzt aber voraus, dass du mit einem Array auf Pointern arbeitest.

    struct indexinhalt **
    

    und für jeden Datensatz mußt du dann wieder ein malloc() aufrufen.

    Falls die Daten, die du in einem Datensatz speichern willst, groß sind,
    macht dies Sinn.

    Gruß mcr



  • Habe es mit calloc und realloc hinbekommen. Danke für die Hilfe^^

    indexstruktur = (struct indexinhalt *) calloc(upper,sizeof(struct indexinhalt));
    
    upper += SIZE_A;
    indexstruktur = (struct indexinhalt *) realloc (indexstruktur, upper * sizeof (struct indexinhalt));
    


  • hi,
    das casten bei *void ** macht man nicht.

    indexstruktur = calloc( upper, sizeof( struct indexinhalt ) );
    
    upper += SIZE_A;
    indexstruktur = realloc( indexstruktur, upper * sizeof ( struct indexinhalt ) );
    


  • blan schrieb:

    das casten bei *void ** macht man nicht.

    ich denke mal, das ist die am meisten verbreitete unsitte im ganzen C-forum.
    🙂



  • void*-freak schrieb:

    blan schrieb:

    das casten bei *void ** macht man nicht.

    ich denke mal, das ist die am meisten verbreitete unsitte im ganzen C-forum.
    🙂

    darüber gabs hier mal eine längere Diskusstion und zum Schluss waren sich glaub die meisten einig, dass man nicht castet.

    mfg blan


Anmelden zum Antworten