Проверка ошибок выделения памяти
Часть раздела Логика и управление потоком путешествия по 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 всегда включает такие проверки, чтобы предотвратить сбои и обеспечить корректную обработку ошибок.
Задание
ЛегкоНапишите программу на C, демонстрирующую правильную обработку ошибок при использовании malloc() для динамического выделения memory. Ваша program должна:
- Считать у пользователя целое число
n, представляющее количество integers для хранения - Использовать
malloc()вместе сsizeof(), чтобы динамически выделить memory для array изnintegers - Проверить, was ли memory allocation successful, проверив, равен ли возвращённый указатель
NULL - Если allocation fails, вывести
Memory allocation failed!и завершить program - Если allocation succeeds, вывести
Memory allocation successful! - Считать у пользователя
ninteger values и store их в allocated array - Вычислить и вывести сумму всех values в формате:
Sum: [value] - Вывести общее количество 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;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Основы указателей
Что такое указатель?Объявление указателейОператор взятия адреса (&)Оператор разыменования (*)Указатели NULLИтоги: Основы указателей4Проект: Простая текстовая утилита
Обзор проектаПодсчет символов2Указатели и массивы
Имена массивов как указателиЭлементы массива — указателиАрифметика указателейСравнение указателейИтоги: Обход массива через указатели5Указатели и функции
Передача по значениюПередача указателей в функцииИзменение переменных через указателиКлассический пример: SwapПередача массивов в функцииИтоги: указатели как аргументы функций8Структуры и указатели
Указатели на структурыОператор «стрелка» (->)Передача структур по значениюПередача указателей на структурыДинамическое выделение памяти для структурИтоги: Изменение структур через указатели11Итоговые задачи на повторение
Повторение: динамическая конкатенация строкПовторение: массив структурПовторение: счетчик частоты слов3Символьные массивы и строки
Строки как массивы charНуль-терминаторВвод строк с помощью scanfИспользование strlen()Использование strcpy()Использование strcat()Использование strcmp()Итоги: основные строковые функции6Управление памятью
Стек против кучиДинамическое выделение — malloc()Использование sizeof() для выделения памятиПроверка ошибок выделения памятиОсвобождение памяти с помощью free()Выделение памяти с помощью calloc()Итоги: Динамический массивПотренируйтесь самостоятельно: Онлайн-компилятор C