Я читаю в книге, что функция malloc в C принимает количество "фрагментов" памяти, которые вы хотите выделить в качестве параметра, и определяет, сколько байтов эти фрагменты основаны на том, на что вы приводите значение, возвращаемое malloc. Например, в моей системе int составляет 4 байта:
int *pointer;
pointer = (int *)malloc(10);
Выделил бы 40 байтов, потому что компилятор знает, что целые числа равны 4 байтам.
Это меня смущает по двум причинам:
Я читал, и параметр размера на самом деле представляет собой количество байтов, которое вы хотите выделить, и не связано с размерами каких-либо типов.
Malloc - это функция, возвращающая адрес. Как он регулирует размер выделенной памяти на основе внешнего приведения адреса, возвращаемого из void к другому типу? Я должен принять какое-то волшебство компилятора?
Я чувствую, что книга неправильная. Любая помощь или разъяснение приветствуются!
Вот что сказано в книге:
char *string;
string = (char *)malloc(80);
80 выделяет 80 блоков памяти. Размер блока задается преобразованием типа (char *), что означает, что malloc () находит хранилище для 80 символов текста.
Ответ 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 () может сильно различаться на разных платформах.