Warum sagt das Buch “The C Programming Language”, dass ich malloc wirken muss?

Lesezeit: 3 Minuten

Benutzeravatar von Michi
Michi

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

7.8.5 Speicherverwaltung

Die Funktionen malloc und calloc beziehen 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 oder NULL zurück, 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 aber in den entsprechenden Typ umgewandelt werden, wie in

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

Das weiß ich schon malloc (und seine Familie) gibt den Typ zurück Leere*und es gibt gute Erklärungen, warum man nicht casten sollte malloc.

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

  • Weil das Buch alt ist.

    – Oliver Charlesworth

    18. September 2015 um 12:38 Uhr

  • Denn auch die Sonne hat ihre dunklen Flecken, wäre meine Antwort. Mit anderen Worten, das Buch ist falsch. Es könnte sein, dass der Text der Semantik für vorausgeht void *, und wurde nicht aktualisiert. Siehe auch diese Antwort.

    – abschalten

    18. September 2015 um 12:38 Uhr


  • @Michi Das Buch hat viele sachliche und typografische Fehler (Google K & R Errata), es ist nur bedingt kompatibel mit dem C90-Standard, es behandelt weder den aktuellen C-Standard noch irgendwelche Änderungen in der Sprache seit 1990. Das Schlimmste ist, dass es voll 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.

    – Ludin

    18. September 2015 um 13:04 Uhr

  • … und kontrastieren Sie dies mit Warum beschwert sich der Compiler, wenn ich das Ergebnis von malloc nicht umsetze? Also, für C – nicht wirken. Für C++ – umwandeln, aber nicht verwenden malloc weil es NICHT C++ ist – außer wenn man muss – aber nicht sollte – außer …AGGGHHHHHH!!!!! 🙂

    – Bob Jarvis – Слава Україні

    18. September 2015 um 17:29 Uhr

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

    – Michi

    18. September 2015 um 18:15 Uhr

Benutzeravatar von David Ranieri
David Ranieri

Aus 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 *. Das neue void * Typ in Standard C macht diese Verrenkungen überflüssig.

Um niemanden in die Verlegenheit zu bringen, K&R-2 unnötigerweise zu verteidigen, bat ich Dennis Ritchie um eine Meinung, 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 S. 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.

  • Der Rückgabetyp von malloc war also verkohlen und nicht Leere. Vielen Dank.

    – Michi

    18. September 2015 um 12:57 Uhr

  • Es wird auch in den Errata erwähnt web.archive.org/web/20150205025553/http://cm.bell-labs.com/cm/…

    – Nr

    18. September 2015 um 13:17 Uhr

  • Sie dürfen dieses Buch nicht ohne diese Errata lesen, die auf einem oder mehreren Papieren neben Ihnen gedruckt ist.

    – Ludin

    18. September 2015 um 13:19 Uhr

  • @Michi – nein, der Rückgabetyp war char*nicht char. Die beiden sind sehr unterschiedlich.

    – Peter Becker

    18. September 2015 um 13:41 Uhr

  • @alk: genau. Wenn Sie K&R lesen, hören Sie zwei Gurus, was reichlich ist 😉

    – Steve Jessop

    18. September 2015 um 15:36 Uhr


1424980cookie-checkWarum sagt das Buch “The C Programming Language”, dass ich malloc wirken muss?

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

Privacy policy