Sollte ich den Rückgabewert von malloc() explizit umwandeln? [duplicate]

Lesezeit: 5 Minuten

Benutzeravatar von Mawia
mawia

Ich wollte zu folgendem Fall fragen:

char *temp;
temp = malloc(10);

Da der Rückgabetyp von malloc ist void*wird der Zeiger von zurückgegeben malloc implizit gecastet werden char* eingeben, bevor er temp zugewiesen wird? Was sagt die Norm dazu?

Wenn unsere Zeigervariable zum Beispiel ein Strukturtyp ist:

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

Wenn wir temp Speicher zuweisen, ohne ihn zu werfen struct node* type, wird es implizit gecastet struct node* Typ oder ist es notwendig, ihn explizit umzuwandeln struct node* Typ?

  • Wenn Sie den Code möglicherweise einmal mit einem C++-Compiler anstelle eines C-Compilers kompilieren müssen, ist die Umwandlung erforderlich. Folglich enthält der größte Teil meines Codes die explizite Umwandlung – obwohl reines C dies nicht erfordert. Normalerweise tagge ich es mit /*=C++=*/, um anzugeben, warum.

    – Jonathan Leffler

    4. Juni 2009 um 23:32 Uhr

  • Obwohl es nicht notwendig ist, hilft es mir später, Code mit wenig Ausführlichkeit zu lesen.

    – Xolve

    7. August 2010 um 6:26 Uhr

  • Siehe auch diese Frage.

    – abschalten

    4. Juni 2013 um 14:50 Uhr

Benutzeravatar von unwind
entspannen

Wenn Sie die Denkweise “Don’t repeat yourself” mögen, sollte es attraktiv sein, dass Sie den Typnamen aus der Deklaration der Variablen in der nicht wiederholen müssen malloc() Anruf. Weil, wie die Leute schon gesagt haben, Sie Folgendes nicht tun: Zeiger konvertieren nach und von void * ohne Verlust, mit Ausnahme von Funktionszeigern.

In diesem Sinne müssen Sie sich auch nicht mit der Verwendung von wiederholen sizeof entweder. Ihr zweites Beispiel bei der Zuweisung einer Struktur kann so geschrieben werden:

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

Was meiner nicht ganz so bescheidenen Meinung nach das ist Beste Weg.

Wenn Sie vermeiden, sich zu wiederholen, reduzieren Sie die Anzahl der Dinge, die Sie schreiben, was wiederum das Risiko verringert, dass eines dieser Dinge falsch ist.

Beachten Sie das Sternchen in der sizeof Argument bedeutet dies “die Größe des Objekts, auf das dieser Zeiger zeigt”, was natürlich dasselbe ist wie “die Größe des Typs struct node“, aber ohne den Typnamen zu wiederholen. Dies liegt daran, dass sizeof berechnet (zur Kompilierzeit!) die Größe des Ausdrucks, der sein Argument ist. Für diesen Fall. So wie sizeof 3 berechnet die Größe eines Ausdrucks vom Typ int, sizeof *temp berechnet die Größe einer Instanz von struct node.

Sicher, Sie wiederholen etwasdh der Variablenname selbst, aber das ist oft ein einfacherer Ausdruck und leichter richtig zu machen, und kann auch für den Compiler einfacher sein, einen Fehler zu erkennen.

  • Dies ist ein Fall, in dem die Anwendung von DRY eine unsichere Programmierpraxis ist (siehe folgenden Link). Das Argument, dass die Vermeidung von Wiederholungen Fehler reduziert, ist kontextabhängig. Wenn es um Zeiger in C geht, das für seine Mehrdeutigkeit so berüchtigt ist, wird es zu schlechtem Juju führen. Ich bin lieber ausführlich und wiederhole die Casts, um Probleme zur Kompilierzeit (im Gegensatz zur Laufzeit) zu finden: securecoding.cert.org/confluence/display/seccode/…

    – luis.espinal

    22. Oktober 2012 um 15:44 Uhr


  • Wie üblich ist securecoding.cert.org voller Mist. Oder, höflicher ausgedrückt, jeder einzelne Artikel, den ich auf dieser Seite gelesen habe, ist voller falscher Informationen (denken Sie an die ftell vs fstat one), Stil, der weithin als schlecht und schädlich angesehen wird, und/oder einfach nur Cargo-Kult-“Sicherheits”-Programmierung.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    8. Januar 2013 um 1:26 Uhr

  • @luis.espinal Häh? Die Abgüsse können ausblenden Fehler, da sie dem Compiler explizit sagen “tu dies!” und verhindert normalerweise, dass Warnungen generiert werden, selbst wenn das, wonach Sie fragen, falsch erscheint. Jedes Mal, wenn Sie einen Cast-C-Code sehen, müssen Sie nachdenken Schwerer ob das, was vor sich geht, erforderlich ist und warum die Besetzung überhaupt für notwendig erachtet wurde. Gießen Sie niemals, wenn Sie nicht müssen.

    – abschalten

    4. September 2013 um 10:19 Uhr

  • Ich persönlich mag die sizeof(*temp)-Notation nicht. Es ist ein wenig kompliziert, wie sizeof funktioniert, wenn Ausdrücke als Argumente verwendet werden (Sie können sogar undefinierte Funktionen verwenden und erhalten keine Linker-Fehler). Hier könnte es verwirrend sein, da der *-Operator normalerweise schlecht für baumelnde oder Nullzeiger ist. Hier funktioniert es auf magische Weise. Ich denke, es ist einfach klarer (insbesondere für nicht erfahrene Programmierer, die über Ihren Code stolpern), einfach sizeof(struct node) zu schreiben. Nur meine persönliche Meinung.

    – bartgol

    24. Juli 2014 um 18:24 Uhr

Benutzeravatar von tekBlues
tekBlues

Ein void-Zeiger in C kann jedem Zeiger ohne explizite Umwandlung zugewiesen werden.

  • Ich glaube nicht, dass es für Funktionszeiger gilt.

    – Bastien Léonard

    4. Juni 2009 um 21:51 Uhr

  • C lässt es undefiniert, ob Sie Funktionszeiger auf Nicht-Funktionszeiger oder zurück umwandeln können. C++ verbietet es explizit und C++1x unterstützt es bedingt

    – Johannes Schaub – litb

    4. Juni 2009 um 22:17 Uhr

  • Und POSIX (mindestens 2008) erfordert, dass Funktionszeiger die gleiche Größe wie Datenzeiger haben, wobei der C-Standard dies undefiniert lässt.

    – Jonathan Leffler

    4. Juni 2009 um 23:31 Uhr

sths Benutzeravatar
etw

C setzt implizit from und to um void*, sodass die Umwandlung automatisch erfolgt. In C++ nur Konvertierung zu void* würde implizit erfolgen, für die andere Richtung ist ein expliziter Cast erforderlich.

  • Hinweis C++ unterstützt die Konvertierung in ein void * ohne Umwandlung.

    anon

    4. Juni 2009 um 21:15 Uhr

In C++ müssen Sie explizit umwandeln, aber das ist wirklich nur die Sprache, die Sie dafür abmahnt.
In c gibt es keine wirkliche Notwendigkeit zu casten, Speicher ist nur Speicher – ich muss eine Suche durchführen, um zu sehen, ob der neueste C-Standard dies erfordert.

1411160cookie-checkSollte ich den Rückgabewert von malloc() explizit umwandeln? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy