2015-09-18 15 views
147

Dziś dotarłem na stronę z The C Programming Language (second edition Brian W. Kernighan & Dennis M. Ritchie) i stwierdziłem, że autor mówi, że muszę odrzucić malloc. Oto część z książki:Dlaczego Księga mówi, że muszę rzucić malloc?

7.8.5 Przechowywanie Zarządzanie

funkcje malloc i calloc uzyskać bloki pamięci dynamicznie.

void *malloc(size_t n) 

zwraca wskaźnik do n bajtów niezainicjowane przechowywania lub null, jeśli wniosek nie może być spełniony.

void *calloc(size_t n, size_t size) 

zwraca wskaźnik dość wolnej przestrzeni na szereg obiektów n o określonym rozmiarze lub NULL jeśli żądanie nie może być spełnione. Pamięć jest inicjowana do zera. Wskaźnik zwrócony przez malloc lub calloc ma prawidłowe ustawienie dla danego przedmiotu, ale musi być wrzucony do odpowiedniego typu, jak w

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

już wiem, że malloc (i jego rodziny) zwraca typ void * i there are good explanations why not to cast malloc.

Ale moje pytanie brzmi: dlaczego książka mówi, że powinienem ją rzucić?

+105

Ponieważ książka jest stara. –

+9

Bo nawet Słońce ma swoje ciemne plamy, byłoby moją odpowiedzią. Innymi słowy, książka jest błędna. Możliwe, że tekst poprzedza semantykę dla 'void *' i nie został zaktualizowany. Zobacz także [ta odpowiedź] (http://stackoverflow.com/a/28460192/28169). – unwind

+6

@Michi Książka ma wiele błędów faktograficznych i typograficznych (google K & R errata), jest tylko w pewnym stopniu zgodna ze standardem C90, nie odnosi się do aktualnego standardu C ani żadnych zmian w języku od 1990 roku. Najgorszy z wszystkiego jest wypełniony ze złą praktyką programowania, złym stylem i kodem, który polega na źle określonych zachowaniach.Wszystko, czego musisz się oduczyć, jeśli zostaniesz profesjonalnym programistą C. – Lundin

Odpowiedz

200

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

w uprzednio ANSI C - jak to opisano w K & R-1 - malloc() zwróciło char * i konieczne było oddać zwróconej wartości we wszystkich przypadkach zmienna odbierająca nie była również char *. Nowy typ void * w Standard C sprawia, że ​​te wygięcia są niepotrzebne.

Aby zapisać nikogo z zakłopotanie skacząc niepotrzebnie do obronie K & R-2, poprosiłem Dennis Ritchie o opinię, że mogę cytat o ważności zdaniu cytowanego wyżej od strony 142. On odpowiedział:

W każdym razie, teraz, gdy ponownie przeczytałem rzeczy na s. 142, myślę, że jest nieprawidłowy; jest napisany w taki sposób, że nie jest tylko defensywny w stosunku do wcześniejszych reguł, ale błędnie przedstawia reguły ANSI.

+19

Tak więc typem zwrotu malloc było ** char **, a nie ** void ** . Dziękuję Ci. – Michi

+10

Jest również wspomniany w erracie http://web.archive.org/web/20150205025553/http://cm.bell-labs.com/cm/cs/cbook/2ediffs.html – nos

+17

Nie możesz przeczytać tej książki bez erraty wydrukowanej na papierze obok ciebie. – Lundin

Powiązane problemy