Почему в книге «Язык программирования C» написано, что я должен вызывать malloc?

158

Сегодня я достиг страницы 167 языка программирования Си (второе издание Брайан В. Керниган и Деннис М. Ричи) и обнаружил, что автор говорит, что я должен сыграть 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 В книге много фактических и типографских ошибок (Google K & R errata), она лишь в некоторой степени совместима со стандартом C90, она не затрагивает ни текущий стандарт C, ни какие-либо изменения в языке с 1990 года. Хуже всего то, что она заполнена плохая практика программирования, плохой стиль и код, основанный на плохо определенном поведении. Все, что вам нужно отучиться, если вы станете профессиональным программистом Си.
Лундин
8
... и сопоставить это с Почему компилятор жалуется, когда я не приводил результат malloc? Итак, для C - не бросайте. Для C ++ - приведение, но не используйте, mallocпотому что это НЕ C ++ - кроме случаев, когда вы должны - но вы не должны - кроме ... AGGGHHHHHH !!!!! :-)
Боб Джарвис - Восстановить Монику
2
@ Mandill ты прочитал мой вопрос? Я должен был отредактировать мой вопрос для вас.
Мичи

Ответы:

215

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

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

Чтобы спасти кого-либо от смущения бесполезного перехода к защите K & R-2, я попросил Денниса Ричи высказать мнение, которое я мог бы процитировать по поводу обоснованности приведенного выше предложения со страницы 142. Он ответил:

В любом случае, теперь, когда я перечитал материал на с. 142, я думаю, что это неправильно; он написан таким образом, что он не просто защищает от предыдущих правил, он искажает правила ANSI.

Дэвид Раньери
источник
23
Таким образом, возвращаемый тип malloc был char, а не void . Спасибо.
Мичи
10
Это также упоминается в сообщении. Web.archive.org/web/20150205025553/http://cm.bell-labs.com/cm/…
nos
18
Вы не должны читать эту книгу без опечаток, напечатанных на бумаге рядом с вами.
Лундин
4
@Michi - нет, тип возврата был char*, нет char. Два совершенно разные.
Пит Беккер,
20
@alk: точно. Читая K & R, вы слушаете двух гуру, которых вполне достаточно ;-)
Стив Джессоп