malloc



  • könnte mir vielleicht einer die folgende zeile erklären? mir ist schon klar, daß malloc speicher reserviert, aber ich verstehe nicht, was das hier mit dem struct auf sich hat... 😕

    z = (struct node *) malloc(sizeof *z);
    


  • So kann ich dir leider auch nicht viel sagen. Wie ist z eigentlich deklariert??

    In ANSI-C brauchst du übrigens den Cast vor malloc() nicht.



  • struct node *z;
    

    so viel zu z ^^ was bewirkt denn der cast?



  • @D-U-D-E,

    bewirken tut der Cast eigendlich nichts.
    Wie AJ schon sagte bei ANSI C ist ein cast
    von void* zu was auch immer optional.

    Aber wenn du so fragst: Hier wird
    der Rückgabewert von malloc zu einem Zeiger
    auf eine Struktur mit dem Namen node
    gecastet.

    Bye Peter.



  • Der bewirkt garnix. Er würde den void* von malloc in einen node* umwandeln - aber das geschieht auch ohne cast. Also sinnlos (und in < C99 sogar gefährlich)



  • ok, wenn ich den cast weglasse, bleibt also

    z = malloc(sizeof *z);
    

    und das soll heißen, daß z die adresse (is ja nen pointer) zugewiesen wurde, die entsprechend ihrer größe reserviert wurde. oder lieg ich falsch?

    ach ja: was ist denn der unterschied, mit dem ansi c und c++ an die zeile da oben rangehen würden?



  • @Shade Of Mine,

    in wiefern kann das denn gefährlich sein.
    Was kann denn passieren wenn man castet?

    Bye Peter.



  • Wenn malloc keinen Prototypen hat - also stdlib.h nicht eingebunden, dann wird int als return typ angenommen. Dies führt auf Plattformen wo sizeof(int)!=sizeof(void*) zu Problemen. Der cast verhindert, dass der Fehler entdeckt wird. In C99 kann dies aber nicht mehr passieren.



  • @Shade Of Mine,
    danke...man lernt halt nie aus 🙂

    Bye Peter.



  • D-U-D-E schrieb:

    ok, wenn ich den cast weglasse, bleibt also

    z = malloc(sizeof *z);
    

    und das soll heißen, daß z die adresse (is ja nen pointer) zugewiesen wurde, die entsprechend ihrer größe reserviert wurde. oder lieg ich falsch?

    ach ja: was ist denn der unterschied, mit dem ansi c und c++ an die zeile da oben rangehen würden?

    Hmmm ich weiß ja nicht was sizeof(*z) zurückliefert (solange z noch keine adresse zugewiesen wurde), aber du bist auf jeden Fall auf der sicheren Seite wenn du sizeof(struct node) schreibst anstatt sizeof(*z).



  • sizeof wird zur Compilezeit anhand des statischen Typs ausgewertet (Ausname: Arrays variabler Länge). Es ist egal, ob z auf was sinnvolles zeigt oder nicht, entscheidend ist der Typ. z = malloc(sizeof *z) ist sogar ein recht verbreitetes Idiom.


Anmelden zum Antworten