Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Язык C

malloc против calloc: ключевые отличия с практическими примерами

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

Динамическое выделение позволяет программе запрашивать и освобождать память во время выполнения. В C стандартная библиотека предоставляет четыре функции: malloc(), calloc(), realloc() и free() — все объявлены в stdlib.h.

malloc(): выделение одиночного блока

malloc() (memory allocation) резервирует непрерывный блок байтов и возвращает указатель на первый байт. Содержимое неинициализировано — там остаются случайные биты.

Типичное использование:

int *p = (int *)malloc(n * sizeof(int));

При неудаче возвращает NULL.

calloc(): выделение нескольких обнулённых блоков

calloc() (contiguous allocation) принимает два аргумента: количество элементов и размер каждого. Выделяет память под все элементы и автоматически обнуляет каждый байт — идеально для массивов или структур, требующих чистого старта.

Типичное использование:

int *p = (int *)calloc(n, sizeof(int));

При неудаче возвращает NULL.

Когда что использовать

Синтаксис

malloc()

void *malloc(size_t size);

calloc()

void *calloc(size_t num, size_t size);

Практические примеры кода

Пример 1: malloc() для 15 целых

#include <stdlib.h>
#include <stdio.h>
int main(void) {
    int *ptr = malloc(15 * sizeof(*ptr));
    if (!ptr) {
        perror("malloc failed");
        return EXIT_FAILURE;
    }
    ptr[5] = 480; // 6-й элемент (0-индексация)
    printf("Value of the 6th integer is %d\n", ptr[5]);
    free(ptr);
    return EXIT_SUCCESS;
}

Вывод: Value of the 6th integer is 480

Пример 2: calloc() для вычисления суммы

#include <stdlib.h>
#include <stdio.h>
int main(void) {
    int *ptr = calloc(10, sizeof(int));
    if (!ptr) {
        perror("calloc failed");
        return EXIT_FAILURE;
    }
    int sum = 0;
    for (int i = 0; i < 10; ++i) {
        ptr[i] = i; // инициализация избыточна, но показана для ясности
        sum += ptr[i];
    }
    printf("Sum = %d\n", sum);
    free(ptr);
    return EXIT_SUCCESS;
}

Вывод: Sum = 45

Побочное сравнение

malloc против calloc: ключевые отличия с практическими примерами

Характеристикаmalloc()calloc()
Количество параметров1 (размер)2 (количество, размер)
Состояние памяти после выделенияНеинициализирована (мусор)Обнулена
Типичный сценарийОдиночный блок, ручная инициализацияМассивы/структуры, требующие чистого старта
ПроизводительностьБыстрее (нет обнуления)Медленнее (накладные расходы на обнуление)
БезопасностьРиск использования мусораМеньше рисков благодаря автообнулению
Возврат при ошибкеNULLNULL
Заголовочный файлstdlib.hstdlib.h

Резюме

Язык C

  1. Выражения, операторы и блоки в C#: подробное руководство с примерами
  2. Цикл do-while в C++: синтаксис, примеры и вложенные циклы
  3. Указатели в C++: концепции, примеры и практические применения
  4. Тип данных char в C++: объявление, ASCII и методы преобразования
  5. Перегрузка операторов в C++: практическое руководство с примерами кода
  6. Функции в C++: подробное объяснение с практическими примерами кода
  7. Коллекции в C#: практическое руководство с реальными примерами
  8. Циклы while и do-while: наглядное сравнение с практическими примерами
  9. calloc() в C: выделение обнулённой памяти и практический пример
  10. Мастерство метода str.count() в Python: как подсчитывать символы и подстроки с примерами