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