Чому в книзі "Мова програмування на С" йдеться про те, що я повинен відкинути малок?


158

Сьогодні я досяг сторінки 167 з Мова програмування C (друге видання Брайан У. Керніган & Dennis M. Ritchie) і виявив , що автор говорить , що я повинен кинути malloc. Ось частина книги:

7.8.5 Управління зберіганням

Функції malloc і calloc динамічно отримують блоки пам'яті.

void *malloc(size_t n)

повертає вказівник на n байтів неініціалізованого сховища або NULL, якщо запит не може бути задоволений.

void *calloc(size_t n, size_t size)

повертає вказівник на достатньо вільного місця для масиву з n об'єктів вказаного розміру або NULL, якщо запит не може бути задоволений. Зберігання ініціалізовано до нуля. Вказівник, повернутий malloc або calloc, має відповідне вирівнювання для відповідного об'єкта, але він повинен бути переданий у відповідний тип, як у

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

Я вже знаю, що malloc(та його сім'я) повертає тип void * , і є хороші пояснення, чому не робити передачуmalloc .

Але моє запитання: Чому книга говорить, що я повинен її віддати?


125
Тому що книга стара.
Олівер Чарлсворт

12
Тому що навіть у Сонця є свої темні плями, була б моєю відповіддю. Іншими словами, книга неправильна. Можливо, текст передував семантиці void *, а не був оновлений. Дивіться також цю відповідь .
розкручується

8
@Michi У книзі є багато фактичних та типографічних помилок (gorata Google K&R errata), вона лише дещо сумісна зі стандартом C90, вона не стосується чинного стандарту C, ані будь-яких змін у мові з 1990 року. Найгірше, що вона заповнена погана практика програмування, поганий стиль та код, який покладається на погано задану поведінку. Все, що вам доведеться навчитися, якщо ви станете професійним програмістом C.
Лундін

8
... і порівняти це з Чому компілятор скаржиться, коли я не передаю результат malloc? Отже, для С - не киньте. Для C ++ - киньте, але не використовуйте, mallocоскільки це НЕ C ++ - за винятком випадків, коли вам доведеться - але не слід - за винятком ... AGGGHHHHHHH !!!!! :-)
Боб Джарвіс - Відновіть Моніку

2
@Mandrill ви читали моє запитання? Мені довелося редагувати моє запитання для вас.
Мічі

Відповіді:


215

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

У попередньому ANSI C - як описано в K & R-1 - malloc () повернув a, char * і потрібно було віддати його повернене значення у всіх випадках, коли приймальна змінна також не була a char *. Новий void *тип Standard C робить ці викривлення непотрібними.

Щоб нікого не врятувати від збентеження, що непотрібно стрибати до захисту K&R-2, я попросив Денніса Річі про думку, що я можу процитувати дійсність вироку, цитованого вище зі сторінки 142. Він відповів:

У будь-якому випадку, тепер, коли я перечитав матеріал на с. 142, я думаю, що це неправильно; це написано таким чином, що воно не просто захищає від попередніх правил, воно неправильно представляє правила ANSI.


23
Таким чином, тип повернення malloc був чарівним і недійсним . Дякую.
Мічі


18
Ви не повинні читати цю книгу без того, щоб вона була надрукована на паперових носіях поруч.
Лундін

4
@Michi - ні, тип повернення був char*, ні char. Два сильно відрізняються.
Піт Бекер

20
@alk: точно. Читаючи K&R, ви слухаєте двох гуру, яких достатньо ;-)
Стів Джессоп
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.