Problem mit Strukturen und Pointern



  • Hallo,

    ich habe mir folgendes struct gebaut:

    typedef struct _node {
        int wert;
        struct _node *next;
    } node;
    

    Mit der folgenden Methode möchte ich gerne etwas einfügen:

    node* insert(node* root, int i) {
        node *neu;    
        neu = malloc(sizeof(node));
        neu->wert = i;
        neu->next = NULL;
        root = neu;
        return neu;
    }
    

    Meine main-Methode, um das Einfügen zu testen, sieht so aus:

    int main(void) {
        node *liste;
        liste = NULL;
        insert(liste, 10);   
        printf("%d\n", liste->wert);    
    }
    

    Ich bekomme allerdings nur einen Segmentation fault anstatt der Ausgabe der Zahl 10. Wenn ich die Funktion direkt in die main reinschreibe, funktioniert das Programm:

    int main(void) {
        node *liste, *neu;
        liste = NULL;    
        neu = malloc(sizeof(node));
        neu->wert = 10;
        neu->next = NULL;
        liste = neu;    
        printf("%d\n", liste->wert);    
    }
    

    Warum funktioniert das jetzt auf einmal, obwohl es derselbe Code ist? Und was müsste ich ändern, damit das ganze mit der insert-Methode funktioniert?


  • Mod

    Mister-X schrieb:

    Warum funktioniert das jetzt auf einmal, obwohl es derselbe Code ist? Und was müsste ich ändern, damit das ganze mit der insert-Methode funktioniert?

    Du hast in deiner Funktion eine Kopie des Zeigers root geändert. Wenn du möchtest, dass der Zeiger auch im Hauptprogramm seinen Wert ändert, benutz call by reference, also einen Zeiger auf einen Zeiger auf node. Oder benutz den Rückgabewert, den du zwar zurückgibst, aber im Hauptprogramm einfach verwirfst.



  • Achso, ich dachte, wenn man Zeiger übergibt, würde davon keine Kopie erstellt werden. Aber gut, dann muss ich wohl den Doppelstern benutzen.


  • Mod

    Mister-X schrieb:

    Achso, ich dachte, wenn man Zeiger übergibt, würde davon keine Kopie erstellt werden. Aber gut, dann muss ich wohl den Doppelstern benutzen.

    Es wird keine Kopie von dem Objekt erstellt, auf das der Zeiger zeigt. Der Zeiger selbst wird aber sehr wohl kopiert. Man muss immer eine Zeigerebene weitergehen als das Objekt, welches man ändern will.


Anmelden zum Antworten