C Funktion: malloc

  • Hallo,


    Bezüglich der C Funktion malloc hätte ich eine grundlegende Frage:

    malloc weist dynamischen Speicher zu. Aber ist diese Funktion im folgenden wirklich nötig? Beispielsweise würde ich gerne eine Funktion schreiben, welche mir einen Pointer auf ein neues struct Element zurückgibt. Vergleiche http://www.pronix.de/pronix-827.html Nun: wann brauche ich malloc?

    struct angestellter{

    char name[20];
    int gehalt;

    };



    struct angesteller *neu neuer_Anstellter(char *name, int gehalt){

    //erstelle struct angestellt
    struct angesteller neu;

    //übernimm funktions-parameter
    strcpy(neu.name, name);
    neu.gehalt = gehalt;

    //erstelle Zeiger von struct neu
    struct angestellt *pointer_auf_angestellt = &neu;

    //gib zeiger zurück
    return pointer_auf_angestellt;

    }


    //BZW DAS GANZE ALS KOPIE VON STRUCT (funktion gibt kopie von struct angesteller zurück


    struct angesteller neu neuer_Anstellter(char *name, int gehalt){

    //erstelle struct angestellt
    struct angesteller neu;

    //übernimm funktions-parameter
    strcpy(neu.name, name);
    neu.gehalt = gehalt;


    return neu;

    }

    In beiden Fällen erstelle ich "dynamisch" ein neues struct OHNE malloc.. Kennt sich da jemand aus?

  • selbstverständlich gibt meine funktion keinen pointer auf die funktion wie irrtümlicherweise angegeben zurück, sondern direkt auf das struct element. also nicht


    struct angesteller *neu neuer_Anstellter(char *name, int gehalt){ blabla }

    sondern ->

    struct *angesteller neu neuer_Anstellter(char *name, int gehalt){ blabla }

  • struct angesteller *neu neuer_Anstellter(char *name, int gehalt){}
    ich glaub das ist doch richtig. wie auch immer, meine funktion gibt einen zeiger zurück, ohne malloc.

  • 'malloc' wird z.b. verwendet, wenn die Größe des zu allozierenden Speichers nicht feststeht. z.b.: wenn ein Array zur Laufzeit erzeugt werden soll.
    Du erzeugst zwar Objekte zur Laufzeit, deren Größe wird aber bereits beim Kompilieren festgelegt.

    "Von der Gewalt, die alle Wesen bindet, befreit der Mensch sich, der sich überwindet." > Learn more ...


  • Du versuchst hier, die Adresse einer lokalen ("automatischen" im C-Speak) Variable zurückzugeben. Das ist nicht erlaubt, da das Objekt "neu" am Ende seiner Lebensdauer, hier am Ende der Funktion, zerstört wird. Der Zeiger auf das zerstörte Objekt ist somit ungültig.
    Die richtige Deklaration der Funktion ist übrigens struct angestellter *funktionsname(parameter), also ohne "neu".


    Das geht so, ja. Allerdings kriegst du damit auch keinen Pointer auf ein Objekt, das länger lebt. Wenn du aus Funktion F mit dieser Funktion einen neuen Angestellten erzeugen läßt, lebt dieser auch (höchstens) bis ans Ende von Funktion F.

    Für Objekte, die über Funktionsaufrufe hinaus leben sollen, gibt es nur static (aber nur, wenn man sich sicher ist, was es tut und wieso man das haben will) oder malloc und Konsorten (realloc/calloc).

    *plantsch*

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!