struct node *tempNode = (struct node*) malloc(sizeof(struct node));
//and
struct node *tempNode = malloc(sizeof(struct node));
Antwort
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 *)
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.
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.
Steht der erste Satz nicht im Widerspruch zu dem im Link genannten? –
@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
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". –
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.
Dies ist keine C++ Frage, oder Java, C#, B * f etc. –
@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
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. –
- 1. Was ist der Unterschied zwischen diesen beiden?
- 2. Was ist der Unterschied zwischen diesen beiden?
- 3. Unterschied zwischen den beiden Linien
- 4. Was ist der Unterschied zwischen diesen beiden Objektinitialisierung in Java?
- 5. Was ist der Unterschied zwischen diesen beiden Codebeispielen? 1
- 6. Was ist der Unterschied zwischen diesen beiden Monadetransformatoren?
- 7. Was ist der Unterschied zwischen diesen beiden Zeiger Deklaration
- 8. Was ist der Unterschied zwischen diesen beiden Funktionen/Ansätzen?
- 9. Was ist der Unterschied zwischen diesen beiden Ereignisdeklarationen?
- 10. Was ist der Unterschied zwischen diesen beiden Warteschlangen-Wrapper?
- 11. Was ist der Unterschied zwischen diesen beiden Initialisierungen?
- 12. Was ist der Unterschied zwischen diesen beiden einfachen SQL-Abfragen?
- 13. Was ist der Unterschied zwischen diesen beiden Bits des Codes?
- 14. Was ist der Unterschied zwischen diesen beiden Array-Iterationen?
- 15. Was ist der Unterschied zwischen diesen beiden Java-Code-Schnipsel?
- 16. Was ist der Unterschied zwischen diesen beiden Importaussagen?
- 17. Was ist der Unterschied zwischen diesen beiden asynchronen Methoden?
- 18. Was ist der Unterschied zwischen diesen beiden Deklarationen in JavaScript?
- 19. Was ist der Unterschied zwischen diesen beiden OpenvSwitch-Befehlen?
- 20. Was ist der Unterschied zwischen diesen beiden SQL-Abfragen
- 21. Was ist der Unterschied zwischen diesen beiden Aussagen?
- 22. Was ist der Unterschied zwischen diesen beiden HTML-Ankern?
- 23. Was ist der Unterschied zwischen diesen beiden Importanweisungen?
- 24. Was ist der Unterschied zwischen diesen beiden Methoden von CSS?
- 25. Was ist der Unterschied zwischen diesen beiden Praktiken:
- 26. Was ist der Unterschied zwischen diesen beiden Ausdrucken mit Prometheus?
- 27. Was ist der Unterschied zwischen diesen beiden Aussagen für Objekte?
- 28. Was ist der Unterschied zwischen diesen beiden Aussagen?
- 29. Was ist der Unterschied zwischen diesen beiden Deklarationen?
- 30. Was ist der Unterschied zwischen diesen beiden Quicksort-Partitionsfunktionen?
'(struct node *)' stummt Compilerfehler, da malloc einen void-Zeiger zurückgibt. – Ultimater
@Ultimater In C wird keine Warnung ausgegeben. Siehe http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc –
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);'. –