Учебная версия на русском. Код и его вывод сохранены в исходном виде.
Динамическая память в 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;
}Открыть в компилятореЧастые вопросы
Почему код и вывод остаются на английском?
Ключевые слова, идентификаторы и строки, проверяемые тестами, сохранены, чтобы не менять программу. Объяснения и элементы управления переведены.