Malloc и Calloc - PullRequest
       20

Malloc и Calloc

2 голосов
/ 09 февраля 2012

Я знаю, что этот вопрос может быть помечен как дубликат различия между malloc и calloc, но все же я хотел бы задать его.

я знаю, что calloc инициирует блок памяти, здесь мой вопрос не фокусируется на этой части.

мой вопрос

определение malloc говорит, что оно выделяет блок памяти указанного размера.

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

Является ли это распределение одного блока памяти и нескольких блоков памяти реальной разницей между ними?

потому что я чувствую, что мы можем сделать то же самое, используя malloc, что можно сделать с помощью calloc.

например:

int *ptr;
ptr=(int *) malloc(100 * (sizeof(int)));

и

int *ptr;
ptr=(int *) calloc(100,sizeof(int));

в конечном итоге выделит в 100 раз больше памяти, необходимой для int.

Ответы [ 7 ]

7 голосов
/ 09 февраля 2012

calloc заполняет память нулями.

p=calloc(n, m); 

эквивалентно

p=malloc(n*m); 
memset(p, 0, m * n);

Таким образом, если вы намереваетесь установить выделенную память на ноль, тогда используйте malloc Вы должны вычислить n*m дважды или использовать временную переменную, что делает calloc.

Редактировать: Я только что прочитал стандарт ISO C и обнаружил, что нигде не указано, что реализацияиз calloc должен проверять, не переполняется ли n*m, то есть превышает ли оно постоянную SIZE_MAX в стандарте C99.

5 голосов
/ 09 февраля 2012

Вы правы в своих примерах кода ... фактическая память, на которую указывает ptr, будет иметь такой же размер (т. Е. Массив в куче из 100 int объектов).Однако, как уже упоминали другие, вызов calloc фактически обнулит эту память, а malloc просто даст вам указатель на эту память, и память может иметь или не иметь все нули в ней.Например, если вы получаете память, которая была переработана из другого объекта, то вызов malloc все равно будет иметь значения от его предыдущего использования.Таким образом, если вы обращаетесь с памятью так, как будто она «чистая», и не инициализируете ее с некоторыми значениями по умолчанию, вы в конечном итоге столкнетесь с неожиданным поведением в вашей программе.

3 голосов
/ 09 февраля 2012

Это было упомянуто ранее на этом сайте, но, судя по другим ответам, я думаю, что стоит повторить; умножение двух целых чисел может привести к переполнению, и если это произойдет,

ptr = malloc(num*size);

, вероятно, не будет иметь желаемого результата (и, скорее всего, приведет к более поздней ошибке сегментации). Для этих ситуаций предпочтительным является calloc(num,size) (хотя вы также можете проверить переполнение перед вызовом malloc, если вас беспокоит тот факт, что calloc() инициализирует вновь выделенную память нулем).

3 голосов
/ 09 февраля 2012

Да, основное отличие указано выше.Также calloc () медленнее, чем malloc () с точки зрения выделения памяти операционной системы.

Указатель возврата malloc () не касается реальной памяти, пока программа не коснется malloc ().Тогда как calloc () возвращает память с оперативной памятью.

3 голосов
/ 09 февраля 2012

Ну calloc также инициализирует блок памяти, чтобы содержать нули в отличие от malloc.

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

=== Вы можете увидеть следующую разницу для mallac () и calloc () function ===

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

Синтаксис:

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

// example
ptr = malloc(num*size);   // for malloc() function
ptr = calloc(num,size);   // for calloc() function

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

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

0 голосов
/ 08 августа 2015

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

, поэтому более целесообразно использовать calloc вместо malloc, чтобы избежать неопределенности в вашем коде.

...