Разница между malloc и calloc? - PullRequest
       93

Разница между malloc и calloc?

715 голосов
/ 08 октября 2009

В чем разница между делами:

ptr = (char **) malloc (MAXELEMS * sizeof(char *));

или

ptr = (char **) calloc (MAXELEMS, sizeof(char*));

Когда стоит использовать calloc вместо malloc или наоборот?

Ответы [ 13 ]

5 голосов
/ 30 августа 2015

Разница пока не упомянута: ограничение размера

void *malloc(size_t size) можно выделить только до SIZE_MAX.

void *calloc(size_t nmemb, size_t size); может выделить до SIZE_MAX*SIZE_MAX.

Эта способность не часто используется на многих платформах с линейной адресацией. Такие системы ограничивают calloc() с nmemb * size <= SIZE_MAX.

Рассмотрим тип из 512 байтов, называемый disk_sector, и код хочет использовать лотов секторов. Здесь код может использовать только до SIZE_MAX/sizeof disk_sector секторов.

size_t count = SIZE_MAX/sizeof disk_sector;
disk_sector *p = malloc(count * sizeof *p);

Рассмотрим следующее, что позволяет выделять еще больше.

size_t count = something_in_the_range(SIZE_MAX/sizeof disk_sector + 1, SIZE_MAX)
disk_sector *p = calloc(count, sizeof *p);

Теперь, если такая система может обеспечить такое большое распределение, это другой вопрос. Большинство сегодня не будет. И все же это происходило в течение многих лет, когда SIZE_MAX было 65535. Учитывая закон Мура , подозреваю, что это произойдет около 2030 года с некоторыми моделями памяти с SIZE_MAX == 4294967295 и пулами памяти в 100 Гбайт. *

4 голосов
/ 19 июня 2018

malloc() и calloc() являются функциями из стандартной библиотеки C, которые позволяют динамическое выделение памяти, что означает, что они оба позволяют выделение памяти во время выполнения.

Их прототипы следующие:

void *malloc( size_t n);
void *calloc( size_t n, size_t t)

Между этими двумя понятиями имеются в основном два различия:

  • Поведение: malloc() выделяет блок памяти без его инициализации, и чтение содержимого этого блока приведет к появлению значений мусора. calloc(), с другой стороны, выделяет блок памяти и инициализирует его нулями, и, очевидно, чтение содержимого этого блока приведет к нулям.

  • Синтаксис: malloc() принимает 1 аргумент (размер, который должен быть выделен), а calloc() принимает два аргумента (количество блоков, которые должны быть выделены, и размер каждого блока).

Возвращаемое значение от обоих - указатель на выделенный блок памяти, в случае успеха. В противном случае будет возвращено NULL , указывающее на ошибку выделения памяти.

Пример:

int *arr;

// allocate memory for 10 integers with garbage values
arr = (int *)malloc(10 * sizeof(int)); 

// allocate memory for 10 integers and sets all of them to 0
arr = (int *)calloc(10, sizeof(int));

Та же функциональность, что и calloc(), может быть достигнута с помощью malloc() и memset():

// allocate memory for 10 integers with garbage values   
arr= (int *)malloc(10 * sizeof(int));
// set all of them to 0
memset(arr, 0, 10 * sizeof(int)); 

Обратите внимание, что malloc() предпочтительно использовать вместо calloc(), поскольку он быстрее. Если требуется нулевая инициализация значений, используйте calloc().

0 голосов
/ 22 июня 2019

Количество блоков:
malloc () Назначает отдельный блок требуемой памяти,
calloc () Назначает несколько блоков запрошенной памяти

Инициализация:
malloc () не очищает и не инициализирует выделенную память.
calloc () инициализирует выделенную память нулем.

Скорость:
Скорость malloc () - быстрая.
Скорость calloc () сравнительно медленная.

Синтаксис:

void *malloc(size_t size);                   // syntex for malloc() function
void *calloc(size_t num, size_t size);       // syntex for calloc() function

Аргумент:
Если учитывать синтаксис malloc (), он будет принимать только 1 аргумент.
Если вы рассмотрите синтаксис calloc (), он будет принимать 2 аргумента

Способ выделения памяти ::
Функция malloc () назначает память нужного «размера» из доступной кучи.
Функция calloc () назначает память, размер которой равен num * size.

Значение по названию:
Название malloc означает приписываемое выделению памяти.
Название calloc означает непрерывное распределение.

...