Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Matt VaughanОтветов: 2

Я читаю в книге, что функция 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 символов текста.

  • В какой книге вы читаете такое несколько эксцентричное представление о том, как работает распределение памяти? Jonathan Leffler 06.04.2013
  • C All-In-One Desk Reference для чайников ... Мне нравится серия для чайников :) Matt Vaughan 06.04.2013
  • Если он ошибается, трудно предсказать, что еще не так. Пора идентифицировать книгу (чтобы мы могли занести ее в черный список) и пойти купить себе лучшую. [... время идет ...] Судя по всему, это книга "Для чайников"; в данном случае тоже написано "чайниками". С силой выбросьте его из окна или в мусорную корзину и найдите что-нибудь получше. "Размер блока" - это "байт" или sizeof(char); приведение не может повлиять на поведение вызова. Jonathan Leffler 06.04.2013
  • Я связался с автором этой книги несколько лет назад, обнаружив около 100 ошибок на первых 50 страницах. Он сказал мне, перефразируя, чтобы получить жизнь, ошибки не имеют значения, и я не должен относиться к программированию так серьезно. Randy Howard 06.04.2013
  • Это на Kindle. Что я делаю!? Matt Vaughan 06.04.2013
  • Удалите его, пока он еще не загрязнил устройство. :) Randy Howard 06.04.2013

gcccmemorypointersmalloc

Ответы

Ответ 1 · рейтинг 8 · Alok Save

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

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

Ответ 2 · рейтинг 7 · Randy Howard

При использовании 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 () может сильно различаться на разных платформах.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы