On Wednesday 15 August 2001 16:07, Matthias Petermann wrote:
Ja, jetzt klappts... Danke nochmal.
Eine Kleinigkeit beschäftigt mich noch:
bis jetzt dachte ich, dass mit "struct list *menu[20]" - wie bereits vorhin geschrieben - Platz für '21' Zeiger reserviert wird (0-20). Allerdings löst irgend etwas um malloc auf menu[20] einen "Segmentation fault" aus. Das Programm hab ich noch einmal angehängt. Die Variable "durchlaeufe" ist auf 20 gesetzt, d.H. mit der folgenden Schleife werden menu[0]-menu[19] alloziert. Setze ich die Variable auf '20' läuft das Programm gegen den Baum, weil es versucht menu[21] zu benutzen. Was bedeutet "struct list *menu[20]" wirklich? Werden 20 Zeiger reserviert oder 21? Wenn 21, dann müsste "struct list *menu[0]" Platz für genau einen Zeiger reservieren, oder?
1) struct list *menu[20]; heißt: Pointer der auf 20 Elemente lange struct list Arrays zeigen darf.
2) struct list menu[20]; heißt: Array von 20 mal struct list (0..19)
3) struct list *menu; heißt: Pointer auf struct list, wenn Du ihm mit malloc(sizeof(struct list)*20) genug Speicher zuweist kannst Du ihn genauso verwenden, wie Variante 2), nur mußt Du ihn selbst mit free(menu) wieder freigeben.
Bei 2 und 3 ist das legal und möglich: menu[3].zustand=5; bei beiden führt das (meistens) zum Absturz (oder anderen lustigen Effekten): menu[21].zustand=7; menu[200]=0; menu[-8]=99; ->> ACHTUNG: keine der Varianten wird einen Fehler des Compilers hervorrufen!
Und das alles hat durchaus berechtigte Anwendungen.
Wenn Dir das zu hoch ist: Scriptsprachen, wie Tcl, Python und Co. sind wesentlich besser gesichert. Auch Java macht sich da recht gut. Pascal ist auch nicht ganz so intuitionsfeindlich.
Das ist der Preis, den man für eine flexible _und_ schnelle Sprache zahlt. ;-)
Konrad