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.


Anmelden zum Antworten