Das Resultat von malloc casten
-
Guten Abend.
Im K&R habe ich gerade diese beiden Codeschnipsel gefunden:
struct tnode *talloc( void ) { return ( struct tnode* ) malloc( ... ); }
p = ( char* ) malloc( ... );
Man soll doch aber nicht casten?
Hier auf Stack-overflow sagen sie auch, dass man das nicht soll: http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc
Meine Frage:
Wann soll ich casten, oder ist das hier nur ein versehen?
-
stackoverflow schrieb:
In C, you don't need to cast the return value of malloc. The pointer to void returned by malloc is automagically converted to the correct type. However, if you want your code to compile with a C++ compiler, a cast is needed.
Da malloc generell nichts in C++ zu suchen hat, kannst du dich auf die ohnehin überwiegende Antwort verlassen: caste nicht! Wenn du es musst, hast du etwas falsch gemacht oder benutzt einen uralten C Compiler.
-
Casts deuten oft auf ein Fehldesign hin, es gibt aber Situationen, in denen man casten muss. c-style casts sind verhältnismäßig fehleranfällig, sie sollten nie verwendet werden, auch wenn sie so schön kurz sind. static_cast ist noch ganz harmlos. reinterpret_cast wird für Typfremde casts benutzt und deutet meistens auf Fehldesign hin, bei const_cast ist mir nur einen Fall bekannt, indem es kein Fehldesign ist.
Manchmal muss man casts aber verwenden, wenn z.b. libraries schlecht designed wurden.
-
Marthog schrieb:
Casts deuten oft auf ein Fehldesign hin, es gibt aber Situationen, in denen man casten muss. c-style casts sind verhältnismäßig fehleranfällig, sie sollten nie verwendet werden, auch wenn sie so schön kurz sind. static_cast ist noch ganz harmlos. reinterpret_cast wird für Typfremde casts benutzt und deutet meistens auf Fehldesign hin, bei const_cast ist mir nur einen Fall bekannt, indem es kein Fehldesign ist.
Manchmal muss man casts aber verwenden, wenn z.b. libraries schlecht designed wurden.C-Forum
. Was anderes als C-Casts wird wohl nicht möglich sein.
-
Dont cast the result schrieb:
Meine Frage:
Wann soll ich casten, oder ist das hier nur ein versehen?Das ist insofern ein Versehen, als das das Buch z.T. schon ISO C beschreibt - unter anderem auch das implizite casting von und zu
void*
(A.6.8) - aber andererseits noch in Kap. 7.8.5 erklärt, dass gecastet werden muss - was nicht mehr der Fall war.Hier habe ich Errata gefunden: http://cm.bell-labs.com/cm/cs/cbook/2ediffs.html