1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

C Funktion: malloc

  • sommeralex
  • 15. Juli 2005 um 11:19
  • Unerledigt
  • sommeralex
    11
    sommeralex
    Mitglied
    Punkte
    1.325
    Beiträge
    188
    • 15. Juli 2005 um 11:19
    • #1

    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?

  • sommeralex
    11
    sommeralex
    Mitglied
    Punkte
    1.325
    Beiträge
    188
    • 15. Juli 2005 um 11:27
    • #2

    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 }

  • sommeralex
    11
    sommeralex
    Mitglied
    Punkte
    1.325
    Beiträge
    188
    • 15. Juli 2005 um 11:34
    • #3

    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.

  • Blixa Barscheck
    12
    Blixa Barscheck
    Mitglied
    Reaktionen
    11
    Punkte
    1.406
    Beiträge
    229
    • 15. Juli 2005 um 11:57
    • #4

    '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 ...

  • Plantschkuh!
    24
    Plantschkuh!
    Mitglied
    Reaktionen
    163
    Punkte
    6.173
    Beiträge
    1.181
    • 15. Juli 2005 um 11:59
    • #5
    Zitat von sommeralex

    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;
    }

    Alles anzeigen


    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".

    Zitat

    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;
    }

    Alles anzeigen


    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*

  • sommeralex
    11
    sommeralex
    Mitglied
    Punkte
    1.325
    Beiträge
    188
    • 15. Juli 2005 um 12:11
    • #6

    Vielen Dank :winking_face:

  • Maximilian Rupp 27. Dezember 2024 um 12:06

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

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

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung