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

Ключевые различия между malloc() и calloc()

  • Функция malloc() возвращает только начальный адрес и не делает его нулевым, с другой стороны, функция calloc() возвращает начальный адрес и делает его нулевым.
  • В функции malloc количество аргументов равно 1, а в функции calloc — 2.
  • Эффективность использования времени malloc() выше, чем у calloc(), тогда как malloc() небезопасна по сравнению с calloc().
  • malloc не инициализирует память, тогда как calloc выполняет инициализацию памяти.
malloc() против calloc()
malloc() против calloc()

Что такое динамическое распределение памяти?

Динамическое распределение памяти это процесс выделения памяти во время выполнения. Существует четыре библиотечных процедуры: calloc(), free(), realloc ()и malloc(), которые можно использовать для выделения памяти и ее освобождения во время выполнения программы. Эти процедуры определены в заголовочном файле stdlib.h.

Что такое malloc()?

Это функция, которая используется для динамического выделения блока памяти. Он резервирует пространство памяти указанного размера и возвращает нулевой указатель, указывающий на ячейку памяти.

Возвращаемый указатель обычно имеет тип void. Это означает, что мы можем назначить функцию malloc любому указателю. Полная форма malloc — выделение памяти.

Что такое calloc()?

Функция Calloc() используется для выделения нескольких блоков памяти. Это функция динамического выделения памяти, которая используется для выделения памяти для сложных структур данных, таких как массивы и структуры. Если этой функции не удается выделить достаточно места, как указано, она возвращает нулевой указатель. Полная форма функции calloc — это непрерывное выделение.

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

Вот важное различие между malloc() и calloc():

таНос () calloc ()
Функция Malloc() создаст один блок памяти размера, указанного пользователем. Функция Calloc() может назначить переменной несколько блоков памяти.
Функция Malloc содержит мусорное значение. Блок памяти, выделенный функцией calloc, всегда инициализируется нулем.
Число аргументов — 1. Количество аргументов — 2.
Calloc медленнее, чем malloc. Malloc работает быстрее, чем calloc.
Это небезопасно по сравнению с calloc. Его использование безопасно по сравнению с malloc.
Эффективность использования времени выше, чем у calloc(). Эффективность использования времени ниже, чем у malloc().
Функция Malloc() возвращает только начальный адрес и не обнуляет его. Прежде чем выделить адрес, функция Calloc() возвращает начальный адрес и делает его нулевым.
Он не выполняет инициализацию памяти. Он выполняет инициализацию памяти.

Синтаксис malloc()

Вот синтаксис malloc()

ptr = (cast_type *) malloc (byte_size);

В приведенном выше синтаксисе ptr является указателем cast_type. Функция malloc возвращает указатель на выделенную память размером byte_size.

Example: ptr = (int *) malloc (50)

При успешном выполнении этого оператора резервируется пространство памяти размером 50 байт. Адрес первого байта зарезервированного пространства присваивается указателю «ptr» типа int.

Синтаксис calloc()

Вот синтаксис malloc()

ptr = (cast_type *) calloc (n, size);

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

Пример malloc() в C

В приведенном ниже коде sizeof(*ptr) используется для выделения блока памяти из 15 целых чисел. В инструкции printf мы находим значение шестого целого числа.

#include<stdlib.h>
#include<stdio.h>
int main(){
int *ptr;
ptr = malloc(15 * sizeof(*ptr)); 
    if (ptr != NULL) {
      *(ptr + 5) = 480; 
      printf("Value of the 6th integer is %d",*(ptr + 5));
    }
}

Вывод:

Значение шестого целого числа — 6.

Пример calloc() в C

Программа на языке C, приведенная ниже, вычисляет сумму первых десяти членов. Если значение указателя равно нулю, то пространство памяти не будет выделено.

Цикл for используется для перебора значения переменной «i» и вывода суммы. Наконец, функция free используется для освобождения указателя.

#include <stdio.h>
#include <stdlib.h>
    int main() {
        int i, * ptr, sum = 0;
        ptr = calloc(10, sizeof(int));
        if (ptr == NULL) {
            printf("Error! memory not allocated.");
            exit(0);
        }
        printf("Building and calculating the sequence sum of the first 10 terms \n");
        for (i = 0; i < 10; ++i) { * (ptr + i) = i;
            sum += * (ptr + i);
        }
        printf("Sum = %d", sum);
        free(ptr);
        return 0;
    }

Вывод:

Построение и вычисление суммы последовательности первых 10 членов n Sum = 45

Зачем использовать malloc()?

Вот причины использования malloc()

  • Вам следует использовать malloc(), когда вам нужно выделить память во время выполнения.
  • Вам следует использовать malloc, когда вам нужно выделить объекты, которые должны существовать после выполнения текущего блока памяти.
  • Используйте malloc(), если вам нужно выделить память, превышающую размер этого стека.
  • Он возвращает указатель на первый байт выделенного пространства.
  • Это позволяет разработчикам выделять память по мере необходимости и в точном объеме.
  • Эта функция выделяет из кучи размер блока памяти в байтах.

Зачем использовать calloc()?

Вот причины использования calloc()

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