Warum sagt das Buch „The C Programming Language“, dass ich Malloc besetzen muss?


158

Heute habe ich Seite 167 von The C Programming Language (zweite Ausgabe Brian W. Kernighan & Dennis M. Ritchie) erreicht und festgestellt, dass der Autor sagt, ich muss besetzen malloc. Hier ist der Teil aus dem Buch:

7.8.5 Speicherverwaltung

Die Funktionen malloc und calloc erhalten Speicherblöcke dynamisch.

void *malloc(size_t n)

Gibt einen Zeiger auf n Bytes nicht initialisierten Speichers oder NULL zurück, wenn die Anforderung nicht erfüllt werden kann.

void *calloc(size_t n, size_t size)

Gibt einen Zeiger auf genügend freien Speicherplatz für ein Array von n Objekten der angegebenen Größe zurück oder NULL, wenn die Anforderung nicht erfüllt werden kann. Der Speicher wird auf Null initialisiert. Der von malloc oder calloc zurückgegebene Zeiger hat die richtige Ausrichtung für das betreffende Objekt, muss jedoch wie in den entsprechenden Typ umgewandelt werden

int *ip;
ip = (int *) calloc(n, sizeof(int));

Ich weiß bereits, dass malloc(und seine Familie) den Typ void * zurückgibt , und es gibt gute Erklärungen, warum man nicht besetztmalloc .

Aber meine Frage ist: Warum sagt das Buch, ich sollte es besetzen?


125
Weil das Buch alt ist.
Oliver Charlesworth

12
Weil sogar die Sonne ihre dunklen Flecken hat, wäre meine Antwort. Mit anderen Worten, das Buch ist falsch. Es kann sein, dass der Text vor der Semantik für void *und nicht aktualisiert wurde. Siehe auch diese Antwort .
Entspannen Sie sich

8
@Michi Das Buch weist viele sachliche und typografische Fehler auf (Google K & R Errata). Es ist nur in gewisser Weise mit dem C90-Standard kompatibel. Es behandelt weder den aktuellen C-Standard noch Änderungen in der Sprache seit 1990. Das Schlimmste ist, dass es gefüllt ist schlechte Programmierpraxis, schlechter Stil und Code, der auf schlecht spezifiziertem Verhalten beruht. All das müssen Sie verlernen, wenn Sie ein professioneller C-Programmierer werden.
Lundin

8
... und kontrastiere dies mit Warum beschwert sich der Compiler, wenn ich das Ergebnis von malloc nicht besetze? Also, für C - nicht besetzen. Für C ++ - Cast, aber nicht verwenden, mallocweil es NICHT C ++ ist - außer wenn Sie müssen - aber Sie sollten nicht - außer ... AGGGHHHHHH !!!!! :-)
Bob Jarvis - Reinstate Monica

2
@ Mandrill hast du meine Frage gelesen? Ich musste meine Frage für Sie bearbeiten.
Michi

Antworten:


215

Von http://computer-programming-forum.com/47-c-language/a9c4a586c7dcd3fe.htm :

In Pre-ANSI C - wie in K & R-1 beschrieben - gab malloc () a zurück char * und es war notwendig, seinen Rückgabewert in allen Fällen umzuwandeln, in denen die empfangende Variable nicht auch a war char *. Der neue void *Typ in Standard C macht diese Verrenkungen unnötig.

Um niemanden vor der Verlegenheit zu bewahren, unnötig zur Verteidigung von K & R-2 zu springen, bat ich Dennis Ritchie um eine Stellungnahme, die ich zur Gültigkeit des oben zitierten Satzes von Seite 142 zitieren könnte. Er antwortete:

Auf jeden Fall jetzt, wo ich das Zeug auf Seite noch einmal gelesen habe. 142, ich denke es ist falsch; Es ist so geschrieben, dass es nicht nur gegen frühere Regeln verteidigt, sondern die ANSI-Regeln falsch darstellt.


23
Der Rückgabetyp von Malloc war also char und nicht ungültig . Danke dir.
Michi


18
Sie dürfen dieses Buch nicht lesen, ohne dass die Errata auf einem oder mehreren Papieren neben Ihnen gedruckt sind.
Lundin

4
@Michi - nein, der Rückgabetyp war char*, nicht char. Die beiden sind sehr unterschiedlich.
Pete Becker

20
@alk: genau. Wenn Sie K & R lesen, hören Sie zwei Gurus, was reichlich ist ;-)
Steve Jessop
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.