Параметр размера функции malloc в C

Я читаю в книге, что функция malloc в C принимает количество «фрагментов» памяти, которые вы хотите выделить в качестве параметра, и определяет, сколько байтов эти фрагменты основаны на том, на что вы приводите значение, возвращаемое malloc. Например, в моей системе int составляет 4 байта:

int *pointer;

pointer = (int *)malloc(10);

Выделил бы 40 байтов, потому что компилятор знает, что целые числа равны 4 байтам.

Это меня смущает по двум причинам:

  1. Я читал, и параметр размера на самом деле представляет собой количество байтов, которое вы хотите выделить, и не связано с размерами каких-либо типов.

  2. Malloc - это функция, возвращающая адрес. Как он регулирует размер выделенной памяти на основе внешнего приведения адреса, возвращаемого из void к другому типу? Я должен принять какое-то волшебство компилятора?

Я чувствую, что книга неправильная. Любая помощь или разъяснение приветствуются!

Вот что сказано в книге:

char *string;
string = (char *)malloc(80);

80 выделяет 80 блоков памяти. Размер блока задается преобразованием типа (char *), что означает, что malloc () находит хранилище для 80 символов текста.


person Matt Vaughan    schedule 06.04.2013    source источник
comment
В какой книге вы читаете такое несколько эксцентричное представление о том, как работает распределение памяти?   -  person Jonathan Leffler    schedule 06.04.2013
comment
C All-In-One Desk Reference для чайников ... Мне нравится серия для чайников :)   -  person Matt Vaughan    schedule 06.04.2013
comment
Если он ошибается, трудно предсказать, что еще не так. Пора идентифицировать книгу (чтобы мы могли занести ее в черный список) и пойти купить себе лучшую. [... время идет ...] Судя по всему, это книга "Для чайников"; в данном случае тоже написано «чайниками». С силой выбросьте его из окна или в мусорную корзину и найдите что-нибудь получше. «Размер блока» - это «байт» или sizeof(char); приведение не может повлиять на поведение вызова.   -  person Jonathan Leffler    schedule 06.04.2013
comment
Я связался с автором этой книги несколько лет назад, обнаружив около 100 ошибок на первых 50 страницах. Он сказал мне, перефразируя, чтобы получить жизнь, ошибки не имеют значения, и я не должен относиться к программированию так серьезно.   -  person Randy Howard    schedule 06.04.2013
comment
Это на Kindle. Что я делаю!?   -  person Matt Vaughan    schedule 06.04.2013
comment
Удалите его, пока он еще не загрязнил устройство. :)   -  person Randy Howard    schedule 06.04.2013
comment
@RandyHoward Это Дэн Гукин? Потому что я знаю, что ты имеешь в виду. Есть много ошибок, которые, если бы у меня не было опыта работы с другими языками, меня бы сбили с толку.   -  person Matt Vaughan    schedule 06.04.2013
comment
Под автором этой книги, я думаю, @RandyHoward имеет в виду автора книги, которую вы назвали, - которым на самом деле является Дэн Гукин. Мне нравится серия для чайников - некоторые из них хороши; это явно не так.   -  person Jim Balter    schedule 06.04.2013
comment
Я потрясен тем, что эта книга имеет 5-звездочный рейтинг на Amazon.   -  person jamesdlin    schedule 06.04.2013
comment
Пожалуйста, найдите время, чтобы опубликовать отзыв на Amazon. Можно также взять классический обзор Шильдта «Аннотированный стандарт ANSI C» Клайва Фезера как модель...   -  person vonbrand    schedule 08.04.2013


Ответы (2)


Да, книга неправильная, и вы правы, пожалуйста, выбросьте эту книгу.
Кроме того, дайте всем знать название книги, чтобы мы могли навсегда поместить ее в наш черный список, который никогда не рекомендовал бы.

Хорошее прочтение:
Какая лучшая практика для malloc?

person Alok Save    schedule 06.04.2013
comment
Также возможно, что он неправильно понял, о чем говорилось в книге. - person David Schwartz; 06.04.2013

При использовании malloc() используйте оператор sizeof и применяйте его к выделяемому объекту, не к его типу.

Не хорошая идея:

int *pointer = malloc (10 * sizeof (int)); /* Wrong way */ 

Лучший метод:

int *pointer = malloc (10 * sizeof *pointer);

Обоснование: если вы измените тип данных, на который указывает указатель, вам также не нужно менять вызов malloc (). Победа в обслуживании.

Кроме того, этот метод менее подвержен ошибкам при разработке кода. Вы можете проверить его правильность, не просматривая объявление, в тех случаях, когда вызов malloc () происходит отдельно от объявления переменной.

Что касается вашего вопроса о приведении malloc (), обратите внимание, что сегодня нет необходимости в приведении к malloc () в C. Кроме того, если тип данных должен измениться в будущей версии, любое приведение там также должно быть изменено или стать еще одним источником ошибок. Кроме того, всегда убедитесь, что у вас есть <stdlib.h>. Часто люди вставляют приведение, чтобы избавиться от предупреждения, которое является результатом отсутствия включаемого файла. Другая причина в том, что это требуется в C ++, но обычно вы не пишете код C ++, который использует malloc ().

Точные детали того, как malloc () работает внутри, не определены в спецификации, по сути, это черный ящик с четко определенным интерфейсом. Чтобы увидеть, как это работает в реализации, вам следует рассмотреть примеры реализации с открытым исходным кодом. Но malloc () может сильно различаться на разных платформах.

person Randy Howard    schedule 06.04.2013