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 reservierenbar **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 reservierenbar **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.