2016-11-22 3 views
0
struct node *tempNode = (struct node*) malloc(sizeof(struct node)); 

//and 

struct node *tempNode = malloc(sizeof(struct node)); 
+0

'(struct node *)' stummt Compilerfehler, da malloc einen void-Zeiger zurückgibt. – Ultimater

+1

@Ultimater In C wird keine Warnung ausgegeben. Siehe http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc –

+2

Die erste wird in C schlecht behandelt; Sie müssen den Rückgabewert von "malloc" seit dem C90-Standard nicht explizit umsetzen, und unter dieser Norm könnte dies eine nützliche Diagnose unterdrücken. Und ein noch besserer Weg, es zu schreiben ist 'struct node * tempNode = malloc (sizeof * tempNode);'. –

Antwort

0
struct node *tempNode = (struct node*) malloc(sizeof(struct node)); 

Sie Zuweisung dynamisch Raum zu einem Knotenzeiger tempnode und typecasting es ein struct node * Typ zu sein. (Zeiger auf Struktur)

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

Das gleiche wie oben, jedoch ohne ausdrückliche Typumwandlung (struct node *)

0

Es gibt keinen Unterschied. Da malloc den Typ void * zurückgibt, kann es einer Variablen eines beliebigen Zeigertyps ohne Casting zugewiesen werden. Wie John Bode erwähnt hat, wird das Casting des Ergebnisses von malloc als schlechte Praxis betrachtet, da es den Compilerfehler maskieren kann, der aus einer anderen Definition von malloc resultieren würde.

0

Da Sie es richtig werfen, gibt es keinen Unterschied zwischen den beiden.

Aber die Besetzung ist in C generell verpönt, da ein void* implizit in jeden anderen (Daten-) Zeigertyp umgewandelt werden kann.

Auch dieses C FAQ-Eintrag: What's wrong with casting malloc's return value?

A dritte ist es:

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

, die besser ist, da es weniger Änderungen im Falle macht die Art geändert wird.

+0

Steht der erste Satz nicht im Widerspruch zu dem im Link genannten? –

+0

@EugeneSh. Ich habe den Link * genau * für alle anderen relevanten Punkte eingefügt. Wenn Sie von "vergessen, einzuschließen .." sprechen, ist es kein gültiges C-Programm (implizite int ist nicht mehr erlaubt). Jeder vernünftige Compiler würde dafür sowieso eine Warnung ausgeben. Ich sehe nicht den vollständigen Code von OP. Also, ich nehme an, OP hat es aufgenommen. Nach allem, was ich weiß, könnte es sein, #define malloc NULL zu definieren, wenn Sie auf diesem Niveau der Nitpicking sind. – usr

+1

Angenommen, der erste Kommentator ist ein Downvoter ist ein * Post hoc ergo propter hoc *. Und es ist kein Nicken. Casting das Ergebnis von "Malloc" ist ein bekanntes "No-No". –

-1

Mit dem Aufruf an malloc wird Speicher zugewiesen, der die Größe struct node in Byte hat. Es gibt einen void* an den zugewiesenen Speicher zurück.

Nun ist die Sache: Beide Zeilen tun genau das gleiche, aber die zweite Zeile wird zu einer Warnung führen, wenn mit einem C++ - Compiler kompiliert wird.

C ermöglicht die implizite Konvertierung eines void* in einen anderen Zeigertyp, während der C++ - Compiler Sie zumindest warnt oder Ihnen einen Fehler meldet.

+0

Dies ist keine C++ Frage, oder Java, C#, B * f etc. –

+0

@WeatherVane also, was ist dein Sinn? In C gibt es offensichtlich keinen Unterschied, aber es ist sehr wahrscheinlich, dass der Fragesteller dies wissen möchte, C++ ist viel mehr mit C verwandt als alles andere. – maxdev

+0

Es tut mir leid, aber C++ ist nicht auf dem Tisch, egal wie "verwandt" du denkst es ist. In C, wenn du denkst, dass es "offensichtlich keinen Unterschied" gibt, hast du den [Link bereits gepostet] nicht gelesen (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) . Ich war versucht, DV, gab Ihnen aber die Möglichkeit, die Antwort zurückzuziehen. –

Verwandte Themen