Zugriff auf Strukturarrays



  • Ich habe eine folgende Struktur gegeben

    struct foo {
    
        struct bar **array;
    };
    

    und bekomme in einer Funktion einen Zeiger auf diese Struktur

    int function( struct foo *ptr );
    

    In dieser Funktion möchte ich gerne ein Element der Struktur bar anhängen. Leider sind meine Versuche bisher gescheitert. Daher wäre ich für Hilfe sehr dankbar.



  • Zeig doch mal deinen Versuch!



  • So vllt.?

    int function( struct foo *ptr )
    {
        size_t i;
        ptr->array = malloc(sizeof(ptr->array)  * anzahl_der_gewuenschten_bar_arrays);
        for(i = 0; i < anzahl_der_gewuenschten_bar_arrays; ++i) 
        {
            ptr->array[i] = malloc(sizeof(ptr->array[i]) * anzahl_der_gewuenschten_bar_array_elemete);
        }
        return 0 + 4711 + 42;
    }
    


  • Ich habe praktisch versucht eine Struktur zu erstellen und darauf zu verweisen:

    struct bar mystruct;
    foo->array[0][0] = mystruct;
    

    hat schonmal nicht geklappt.

    und auch irgendwie sowas wie

    foo->*array = &mystruct;
    

    hat nicht geklappt.



  • inwiefern "nicht geklappt" ?

    struct bar mystruct; 
    foo->array[0][0] = mystruct;
    

    hast du vorher das array dynamisch reserviert ?

    wenn nein dereferenzierst du den ungültigen inhalt eines ungültigen
    zeigers -> Speicherschutzverletzung !

    an sich ist der code richtig

    um das array zu reservieren musst du erst ein array von zeigern belegen und
    für jeden dieser zeiger nochmal speicher reservieren

    bar **reserve(unsigned zeilen. unsigned spalten)
    {
        bar **ptr = new bar *[zeilen];
        for (unsigned i = 0; i < spalten; ++i)
            bar[i] = new bar[spalten];
        return bar;
    }
    

    der einfachheit halberh habe ich jetzt keine fehlerbhandlung eingebaut

    wenn das array korrekt reserviert wurde, sollte der zugriff klappen

    und löschen nicht vergessen :p



  • inwiefern "nicht geklappt" ?

    struct bar mystruct; 
    foo->array[0][0] = mystruct;
    

    hast du vorher das array dynamisch reserviert ?

    wenn nein dereferenzierst du den ungültigen inhalt eines ungültigen
    zeigers -> Speicherschutzverletzung !

    an sich ist der code richtig

    um das array zu reservieren musst du erst ein array von zeigern belegen und
    für jeden dieser zeiger nochmal speicher reservieren

    bar **reserve(unsigned zeilen. unsigned spalten)
    {
        bar **ptr = new bar *[zeilen];
        for (unsigned i = 0; i < spalten; ++i)
            bar[i] = new bar[spalten];
        return bar;
    }
    

    der einfachheit halberh habe ich jetzt keine fehlerbhandlung eingebaut

    wenn das array korrekt reserviert wurde, sollte der zugriff klappen

    und löschen nicht vergessen :p



  • helferlein schrieb:

    bar **reserve(unsigned zeilen. unsigned spalten)
    {
        bar **ptr = new bar *[zeilen];
        for (unsigned i = 0; i < spalten; ++i)
            bar[i] = new bar[spalten];
        return bar;
    }
    

    So gehts sicher nicht.


Anmelden zum Antworten