On Wed, Aug 15, 2001 at 02:53:03PM +0200, Matthias Petermann wrote:
Hallo LUG, #include <stdio.h> #include <stdlib.h> #include <string.h>
int main() { struct list { int zustand; char beschreibung[40]; };
struct list *menu[20];
Also 20 Pointer auf 20 Strukturen. Wenn ich jetzt nicht ganz blöd bin. Wenn Du ein Array von 20 Strukturen willst (wolltest Du aber wohl nicht), dann \verb!struct list menu[20]! Hat aber mit Dynamik nix mehr zu tun.
Und da Du jetzt 20 Pointer hast, mußt Du nun auch 20x Platz für die Strukturen allozieren.
for (i = 0; i < 20; ++i) { menu[i] = (struct list*) malloc(sizeof(struct list)); assert(menu[i]); /* FIXME */ }
menu[0] = (struct list *) malloc( sizeof(struct list) ); if (menu[0] == NULL ) { printf("Fehler bei der Speicherzuordnung\n"); exit(EXIT_FAILURE); strcpy( menu[0].beschreibung, "Testbeschreibung" );
Und nun liegt in menu[0] ja ein _Pointer_, also kannst Du nicht mit "." auf Strukturelemente zugreifen, sondern mußt den Pointer derefenzieren.
strncpy((*menu[0]).beschreibung, "Testbeschreibung", 39);
Die Klammern bei (*menu[0]).beschreibung, weil der "." stärker klebt als der "*". Und weil wir keine Klammeraffen sind, hat man "->" erfunden.
(*menu[0]).beschreibung und menu[0]->beschreibung
sind identisch. Also
strncpy(menu[0]->beschreibung, "Testbeschreibung", 39);
Eine andere Möglichkeit, die vielen Mallocs zu sparen, wäre (unkommentiert) etwa das folgende:
struct list *p = malloc(20 * sizeof(struct list)); struct list *menu[20]; for (i = 0; i < 20; ++i) menu[i] = p + i;
strncpy(menu[0]->beschreibung, ....
Der Rest dann wie gehabt. Oder gleich so:
struct list *menu = malloc(20 * sizeof(struct list)); strncpy(menu[0].beschreibung, ....
Oder? Man möge mich korrigieren. Ich bin leider kein Professional Programmer und habe nicht so sehr viel Programmierlebenserfahrung und bin auch kein Informatiker und weiß eigentlich nicht, wie _wirklich_ programmmiert wird ;-)
Best regards from currently Schwerin/Germany Viele Gruesse aus Schwerin/Mecklenburg-Vorpommern Heiko Schlittermann