Zeiger auf Struktur und malloc



  • Ich habe ein Problem mit folgendem Code:

    struct any{
        int some_int;
    };
    
    int main(){
        struct any* tmp = 0;
        create_struct(tmp);
        return 0;
    }
    
    void create_struct(struct any* a){
        if (a = (struct any*) malloc(sizeof(struct any)) == NULL)
            some_error_handling();
    
        //...
    }
    

    In der Funktion create_struct wird erfolgreich mit malloc Speicher reserviert. Kehr allerdings create_struct zurück, ist tmp weiterhin NULL. Müsste tmp nicht auf den reservierten Bereich von malloc zeigen? Ich übergebe ja auch einen Zeiger? 😮

    Danke im voraus! 🙂



  • Bei der Übergabe kannst du den Bereich ändern, auf den tmp (bzw. a) zeigt. Aber da a nur eine lokale Kopie von tmp ist, ändert sich tmp nicht dabei. Du brauchst:

    void create_struct(struct any** pa)
    {
      if( (*pa = (struct any*) malloc(sizeof(struct any))) == NULL )
        error_handling();
      //...
    }
    
    struct any* tmp;
    create_struct(&tmp);
    //...
    


  • Besten dank!

    Nur damit ich es auch richtig verstehe: Es wird zwar ein Zeiger auf einen Speicherbereich übergeben, allerdings vom dem Zeiger selbst nur eine Kopie. Deshalb ändert sich auch die Adresse des Zeigers nicht?

    Wenn dem so ist, dann hab ich auch den Sinn von Zeigern auf Zeiger so eben verstanden. 🙂



  • bentja schrieb:

    Nur damit ich es auch richtig verstehe: Es wird zwar ein Zeiger auf einen Speicherbereich übergeben, allerdings vom dem Zeiger selbst nur eine Kopie. Deshalb ändert sich auch die Adresse des Zeigers nicht?

    Genau erfasst - in C gibt es offiziell nur Übergabe per Wert (d.h. Kopie), deshalb muß man Referenz-Übergabe durch Zeiger nachbilden.


Anmelden zum Antworten