bitte überprüft meine Struct
-
Hallo, Leute schlage mich schon seit 2 tagen mit structuren, mochte nur das etwas in structuren eingegeben und dann wieder abgelesen wird,erstmal ohne funktionen. doch immer wieder kommt ein zugriffsfehler...was mache ich falsch?
#include <stdio.h> #include <malloc.h> #include <stdlib.h> #define MAX 20 struct student { int matnr; struct student * next; }; void main() { int count; struct student * root = NULL; struct student * kopf; root=(student*)malloc(sizeof(struct student)); root->matnr=2000; kopf=root; //kopf=erstes Element; printf("%d",root->matnr); root=kopf->next; for (int count=1;count<4;count++) { root=(student*)malloc(sizeof(struct student)); root->matnr=count; printf("MAIN %d\n",root->matnr); root=root->next; } //Ausgabe**************************************************** root=kopf; //bringe root wieder auf erstes Element do { printf("Ausgabe: %d\n",root->matnr); root=root->next; }while(root->next !=NULL); system("pause"); }
-
In Zeile 28 veränderst du nur root, nicht aber kopf->next!
Entweder du nutzt ein student** p; dazwischen und machst die Zuweisung über *p, oder du darfst Zuweisungen nur bei head->next machen.#include <stdlib.h> struct S { struct S *next; }; int main(void) { struct S *s = malloc(sizeof(*s)); s->next = malloc(sizeof(*s)); // ok, der Wert in *s wird gesetzt. s->next->next = malloc(sizeof(*s)); // ok, der Wert in *s->next wird gesetzt struct S **p = &s->next->next; *p = malloc(sizeof(**p)); // ok, der Wert von *s->next->next->next wird gesetzt. struct S *p2 = (*p)->next; p2 = malloc(sizeof(*p2)); // AUA! Hier wird nur die lokale Variable "p2" verändert! Die Liste wurde nicht verlängert! return 0; }
PS:
<malloc.h>, void main(), wo lernt man den Schwachfug?
-
achso, jetzt ist es mir klar) vielen Dank! zimlich unübersichtlich mit diesen Zeiger (( dann schaue ich mal ob es jetzt klappt)
-
cooky451 schrieb:
... struct S **p = &s->next->next; ...
Glaubst du, das versteht ein offenkundiger Zeiger-Anfänger?
-
#include <stdio.h> #include <stdlib.h> #define MAX 20 /* so kurze und Allerweltsnamen sind schlecht, die könnten in den Headern schon 'vergeben' sein! */ struct student { int matnr; struct student * next; }; int main() { int count; struct student * root = NULL; struct student * kopf; /* calloc(1,...) statt malloc(...) initialisiert den next-Zeiger gleich mit NULL, sonst läufst du abschließend über das Ende der Liste hinaus */ root=calloc(1,sizeof(struct student)); root->matnr=2000; kopf=root; /*kopf=erstes Element;*/ printf("%d",root->matnr); for (count=1;count<4;count++) { root->next=calloc(1,sizeof(struct student)); /* Anlegen des neuen Elements und Verdrahten auf den aktuellen next-Zeiger */ root->next->matnr=count; printf("MAIN %d\n",root->next->matnr); root=root->next; } /*Ausgabe****************************************************/ root=kopf; /*bringe root wieder auf erstes Element*/ do { printf("Ausgabe: %d\n",root->matnr); root=root->next; }while(root !=NULL); return 0; }
-
@ Wutz vielen vielen Dank! so läuft das Ding endlich!!! musste allerding vor calloc noch (student*) einfügen, weil mein kompiler ziemlich pingerlich ist, aber jetzt endlich mal ein Wunder))) danke noch mal!!!
-
Schön für dich, wenn es läuft. Noch besser, wenn du auch was verstanden hast, u.a. dass du gerade mit einem C++ Compiler C-Code übersetzt, was nur Anfänger und Dozenten tun.