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?
-
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 ausBye 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.