Das Hauptproblem bei malloc
ist es, die richtige Größe .
Der zurückgegebene Speicherplatz malloc()
es untypisiert und es wird nicht auf magische Weise eine effektive Art durch einen einfachen Wurf.
Ich denke, dass beide Ansätze in Ordnung sind und die Wahl von der Absicht des Programmierers abhängen sollte.
- Wenn die Zuweisung von Speicher für eine Typ und dann einen Gips verwenden.
ptr = (T*)malloc(sizeof(T));
- Wenn Sie Speicher für einen bestimmten Zeiger zuweisen, dann verwenden Sie keinen Cast.
ptr = malloc(sizeof *ptr);
Anzeige 1
Die erste Methode stellt die richtige Größe sicher, indem sie Speicher für einen bestimmten Typ zuteilt und ihn dann gliedert, um sicherzustellen, dass er dem richtigen Zeiger zugewiesen wird. Wenn der falsche Typ von ptr
verwendet wird, wird der Compiler eine Warnung/Fehler ausgeben. Wenn der Typ von ptr
geändert wird, zeigt der Compiler die Stellen an, an denen der Code überarbeitet werden muss.
Darüber hinaus kann die erste Methode zu einem Makro kombiniert werden, das ähnlich aussieht wie new
Operator in C++.
#define NEW(T) ((T*)malloc(sizeof(T)))
...
ptr = NEW(T);
Außerdem funktioniert diese Methode, wenn ptr
es void*
.
Anzeige 2
Die zweite Methode kümmert sich nicht um die Typen, sondern stellt die korrekte Größe sicher, indem sie sie vom Typ des Zeigers ableitet. Der Hauptvorteil dieser Methode ist die automatische Anpassung der Speichergröße, wenn der Typ des ptr
geändert wird. Das kann beim Refactoring einige Zeit (oder Fehler) sparen.
Der Nachteil ist, dass die Methode nicht funktioniert, wenn ptr
es void*
aber es kann als eine gute Sache wahrgenommen werden. Und dass es nicht mit C++ zusammenarbeitet, so dass es nicht in Inline-Funktionen in Headern verwendet werden sollte, die von C++-Programmen verwendet werden sollen.
Ich persönlich bevorzuge die zweite Option.
35 Stimmen
stackoverflow.com/q/7545365/168175
9 Stimmen
Gussformen sind böse. Ich sehe so viele Abdrücke im Code, die nur das Ergebnis einer schlechten Programmierpraxis sind. Wann immer Sie einen Cast einfügen müssen, sollten Sie sich als erstes fragen, was hier falsch ist. Ist alles so deklariert, wie es sein sollte? Wenn ja, wäre kein Cast erforderlich, also ist etwas falsch deklariert. Wenn Sie wirklich etwas auf niedriger Ebene mit einzelnen Bytes in einem int oder so tun müssen, ziehen Sie eine Union in Betracht, um auf sie zuzugreifen. Das wird sie genau richtig deklarieren. Als Faustregel gilt: Fügen Sie sie nicht ein, es sei denn, der Compiler beschwert sich. Dann vermeiden Sie sie. Dieses Beispiel wird sich nicht beschweren. void pointer wird zu jedem Typ promoten.
2 Stimmen
@HansLepoeter in C++ sind diese für malloc erforderlich, was meine Vermutung stützt, dass damit etwas nicht stimmt