2788 Stimmen

Muss ich das Ergebnis von malloc casten?

En diese Frage schlug jemand in einer Kommentar dass ich no werfen das Ergebnis von malloc . d.h., ich sollte dies tun:

int *sieve = malloc(sizeof(*sieve) * length);

statt:

int *sieve = (int *) malloc(sizeof(*sieve) * length);

Warum sollte dies der Fall sein?

35 Stimmen

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

10voto

Mohit Punkte 865
  1. Wie bereits erwähnt, wird es nicht für C, sondern für C++ benötigt.

  2. Die Einbeziehung des Casts kann es ermöglichen, ein C-Programm oder eine Funktion als C++ zu kompilieren.

  3. In C ist dies unnötig, da void * automatisch und sicher in jeden anderen Zeigertyp überführt wird.

  4. Aber wenn Sie dann werfen, kann es einen Fehler verbergen, wenn Sie vergessen haben, die stdlib.h . Dies kann zu Abstürzen führen (oder, schlimmer noch, einen Absturz nicht verursachen erst viel später in einem völlig anderen Teil des Codes).

    Denn stdlib.h den Prototyp für malloc enthält, gefunden. In Ermangelung keinen Prototyp für malloc, verlangt der Standard, dass der C Compiler annimmt, dass malloc einen int zurückgibt. Wenn kein Cast vorhanden ist, wird eine Warnung ausgegeben, wenn diese ganze Zahl dem Zeiger zugewiesen wird; Mit dem Cast wird diese Warnung jedoch nicht ausgegeben, was einen Fehler verbirgt.

9voto

iec2011007 Punkte 1700

Das Konzept hinter void pointer ist, dass er in einen beliebigen Datentyp gecastet werden kann, weshalb malloc void zurückgibt. Sie müssen sich auch der automatischen Typisierung bewusst sein. Es ist also nicht zwingend erforderlich, den Zeiger zu casten, obwohl Sie es tun müssen. Es hilft dabei, den Code sauber zu halten und erleichtert die Fehlersuche.

15 Stimmen

" Es ist nicht verpflichtend - aber Sie müssen es tun " - Ich glaube, das ist ein Widerspruch in sich!

10 Stimmen

Ich denke, Sie sollten diesen Beitrag jemandem vorlesen, um zu sehen, ob er versteht, was Sie zu sagen versuchen. Dann schreiben Sie ihn um und machen Sie deutlich, was Sie sagen wollen. Ich kann wirklich nicht verstehen, was Ihre Antwort ist.

4voto

tstanisl Punkte 10631

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.

  1. Wenn die Zuweisung von Speicher für eine Typ und dann einen Gips verwenden.

ptr = (T*)malloc(sizeof(T));

  1. 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.

0voto

pasignature Punkte 495

Für mich ist die Schlussfolgerung, die ich hier ziehen kann, dass das Casting malloc in C ist absolut NICHT notwendig, aber wenn man trotzdem castet, wird es keine Auswirkungen auf malloc como malloc wird Ihnen trotzdem den gewünschten Speicherplatz zuweisen. Ein weiterer Grund, den man mit nach Hause nehmen kann, ist der Grund oder einer der Gründe, warum Menschen Casting betreiben, nämlich um dasselbe Programm entweder in C oder C++ kompilieren zu können.

Es mag andere Gründe geben, aber andere Gründe würden Sie früher oder später mit ziemlicher Sicherheit in ernsthafte Schwierigkeiten bringen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X