Menu
Coddy logo textTech

Проверка ошибок выделения памяти

Часть раздела Логика и управление потоком путешествия по C на Coddy. Урок 34 из 63.

Хотя malloc() — мощный инструмент для динамического выделения памяти, вы должны понимать важную реальность: malloc() может завершиться неудачей. Когда в системе заканчивается доступная память, malloc() не может выполнить ваш запрос и вместо корректного адреса памяти возвращает NULL.

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

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

if (ptr == NULL) {
    printf("Memory allocation failed!\n");
    return -1;  // Выйти из программы или обработать ошибку
}

// Здесь безопасно использовать ptr
*ptr = 42;

Эта проверка NULL не является необязательной — она необходима для написания надёжных программ на C. Даже если сбои при выделении memory редко случаются в современных системах, они могут произойти, особенно в средах с ограниченными ресурсами или при запросе большого объёма memory. Профессиональный код на C всегда включает такие проверки, чтобы предотвратить сбои и обеспечить корректную обработку ошибок.

challenge icon

Задание

Легко

Напишите программу на C, демонстрирующую правильную обработку ошибок при использовании malloc() для динамического выделения memory. Ваша program должна:

  1. Считать у пользователя целое число n, представляющее количество integers для хранения
  2. Использовать malloc() вместе с sizeof(), чтобы динамически выделить memory для array из n integers
  3. Проверить, was ли memory allocation successful, проверив, равен ли возвращённый указатель NULL
  4. Если allocation fails, вывести Memory allocation failed! и завершить program
  5. Если allocation succeeds, вывести Memory allocation successful!
  6. Считать у пользователя n integer values и store их в allocated array
  7. Вычислить и вывести сумму всех values в формате: Sum: [value]
  8. Вывести общее количество allocated bytes в формате: Bytes allocated: [value]

Не забудьте include заголовочный файл <stdlib.h> для использования malloc(). Ваша program должна демонстрировать essential practice проверки failure выделения memory перед попыткой использовать allocated memory.

Например, если input имеет вид:

4
10 20 30 40

Ваш output должен быть таким:

Memory allocation successful!
Sum: 100
Bytes allocated: 16

Это challenge подчёркивает критическую важность defensive programming при работе с динамическим выделением memory, обеспечивая graceful обработку potential memory allocation failures вместо неожиданного сбоя.

Попробуйте сами

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

int main() {
    // Прочитать количество целых чисел
    int n;
    scanf("%d", &n);
    
    // TODO: Напишите свой код здесь
    // - Используйте malloc() для выделения памяти под n целых чисел
    // - Проверьте, успешно ли выполнено выделение
    // - Обработайте как случаи успеха, так и неудачи
    // - Считайте целые числа и сохраните их
    // - Calculate the sum and bytes allocated
    
    return 0;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком

Потренируйтесь самостоятельно: Онлайн-компилятор C