Problem mit Pointern



  • Hallo,

    ich habe ein Prgrämmchen geschrieben, welches ein Element an eine bestehende Liste anhängt und diese Liste soll dann in der Main Funktion wieder ausgegeben werden.

    Eines vorweg: Es handelt sich um eine Hausaufgabe, also keinen Sinn dahinter vermuten 😉

    #include <stdio.h>
    #include <time.h>
    #include <stdlib.h>
    
    typedef struct elem *IntList;
    typedef struct elem {
    	int wert;
        IntList next;
    } elemtype;
    
    void Append(IntList *l,int n) {
    	IntList pointer, neu;
    	pointer = *l;
    	neu = (IntList) malloc(sizeof(elemtype));
    	neu->wert = n;
    	neu->next = NULL;
    	if (pointer == NULL) {
    		pointer = neu;
    		return;
    	}
        while (pointer->next != NULL) {
    		pointer = pointer->next;
    	}
    	pointer->next = neu;
    }
    
    void InputToList(IntList *l) {
    	Append(l,1234); // Hier wird 1234 an die bestehende Liste angehangen
    }
    
    void main() {
    	IntList l;
    	l = (IntList) malloc(sizeof(elemtype));
    	l = NULL;
    	InputToList(&l);
    	getch();
    	printf("%d",l->wert); //HIER KOMMT DER EXCEPTION FEHLER WÄHREND DER LAUFZEIT
    }
    

    Wie man sieht, soll in dem Beispiel auch das Aufsplitten in Unterfunktionen gezeigt werden. Daher auch die eigentlich unsinnige Trennung von Append() und InputToList().

    Eigentlich sollte das Teil ja stimmen.

    Aber an der o.g. Stelle kommt ein Exception Fehler.

    Könnt ihr mir weiterhelfen ?

    Ciao The_Unknown



  • also zwei Sachen:

    1.: wie lautet denn die exception?

    2.: schau dir mal Append genau an.
    du wirst feststellen, dass l->wert überhaupt keinen Wert hat.
    denn die 1234 wird ja erst in l->next->wert geschrieben.
    Ich möchte zwar nicht behaupten, dass das der Fehler ist,
    aber man trifft ja oft auf verwirrende Dinge am PC...

    versuch einfach mal
    ->
    printf("%d",l->next->wert);

    PS: mir ist da gerade noch etwas aufgefallen -.-

    IntList l;
    l = (IntList) malloc(sizeof(elemtype));
    l = NULL;
    

    sag mal, was soll das denn werden?
    du reservierst Speicher und schreibst die Adresse in deinen Zeiger...
    is ja ok.
    aber wieso schreibst du dann NULL in den Zeiger?
    damit erzeugst du ein Speicherlag, weil du den vorher reservierten Speicher nie mehr freigeben können wirst!
    außerdem solltest du bereits in Append() eine exception wegen unerlaubten Speicherzugriffs auf 0x00000000 bekommen!

    also nimm die Zeile
    l = NULL;
    raus.

    und wenn du richtig aufgepasst hättest, würde dir klar sein, dass du Speicher,
    den du mit malloc reservierst, auch mit free wieder freigeben musst!


Anmelden zum Antworten