Online C Compiler
Открыть в компиляторе

Учебная версия на русском. Код и его вывод сохранены в исходном виде.

Динамическая память в C: malloc и calloc

Выделяйте, изменяйте размер и освобождайте память, проверяя объём и ошибки.

Открыть в компиляторе

Динамическая память в C: malloc и calloc
Выделяйте, изменяйте размер и освобождайте память, проверяя объём и ошибки.

malloc выделяет блок с неопределённым начальным содержимым. calloc выделяет место для элементов и обнуляет байты. Не читайте данные malloc до инициализации; нулевые байты не являются универсальной гарантией представления значений любого типа.

Проверяйте результат и вычисляйте размер без переполнения. При realloc сохраняйте исходный указатель до подтверждения успеха: при неудаче с положительным размером старый блок остаётся действительным.

Освобождайте блок ровно один раз после завершения работы. Не обращайтесь к нему после free и не освобождайте автоматическую память или адрес внутри блока. Реальные программы также должны обрабатывать отказ выделения.

Код C

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    size_t count = 4;
    int *scores = calloc(count, sizeof *scores);
    if (scores == NULL) {
        fputs("Allocation failed.\n", stderr);
        return 1;
    }

    scores[2] = 9;
    for (size_t i = 0; i < count; ++i) {
        printf("%d%s", scores[i], i + 1 == count ? "\n" : " ");
    }

    free(scores);
    return 0;
}
Открыть в компиляторе

Частые вопросы

Почему код и вывод остаются на английском?

Ключевые слова, идентификаторы и строки, проверяемые тестами, сохранены, чтобы не менять программу. Объяснения и элементы управления переведены.