Динамическое выделение — malloc()
Часть раздела Logic & Flow путешествия по C на Coddy — урок 32 из 63.
Теперь вы узнаете о malloc(), основной функции для запроса памяти из кучи во время выполнения программы. Функция malloc() означает «memory allocation» (выделение памяти) и позволяет динамически выделять память, когда она вам нужна, вместо того чтобы объявлять переменные фиксированного размера во время компиляции.
Функция malloc() принимает один аргумент: количество байтов, которые вы хотите выделить. Она возвращает void-указатель на выделенный блок памяти или NULL, если выделение памяти завершилось неудачей. Поскольку она возвращает void-указатель, вы должны привести его к соответствующему типу данных.
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // Выделение памяти для одного целого числа
// ptr теперь указывает на область памяти, которая может хранить целое числоКлючевое преимущество
malloc()заключается в гибкости — вы можете запросить именно тот объем памяти, который вам нужен во время выполнения, и эта память остается доступной до тех пор, пока вы явно не освободите ее. Это особенно полезно, когда вы не знаете, сколько памяти вам понадобится, до тех пор, пока программа не будет запущена.
Не забудьте подключить <stdlib.h>, чтобы использовать malloc(), и всегда приводите возвращаемый указатель типа void к типу данных, с которым вы работаете.
Задание
ЛегкоНапишите программу на языке C, которая демонстрирует динамическое выделение памяти с использованием malloc() для создания и работы с одним целым числом в куче. Ваша программа должна:
- Использовать
malloc()для динамического выделения памяти для одного целого числа - Привести возвращаемый указатель типа void к указателю на целое число
- Считать целое число из пользовательского ввода
- Сохранить введенное значение в динамически выделенной памяти, используя оператор разыменования
- Вывести сохраненное значение в формате:
Stored value: [value] - Вычислить и сохранить квадрат этого значения в ту же область памяти
- Вывести квадрат значения в формате:
Squared value: [value]
Не забудьте включить заголовочный файл <stdlib.h> для использования malloc(). Ваша программа должна демонстрировать базовый процесс динамического выделения памяти: запрос памяти из кучи, использование её для хранения и обработки данных, а также работу с выделенной памятью через операции с указателями.
Например, если пользователь вводит 7, ваш вывод должен быть следующим:
Stored value: 7
Squared value: 49Эта задача познакомит вас с фундаментальной концепцией динамического выделения памяти, когда память запрашивается во время выполнения программы, а не фиксируется на этапе компиляции, что обеспечивает вашим программам большую гибкость в использовании памяти.
Шпаргалка
Функция malloc() динамически выделяет память из кучи во время выполнения программы. Она принимает количество байтов для выделения и возвращает указатель типа void на выделенный блок памяти или NULL, если выделение не удалось.
Подключите <stdlib.h>, чтобы использовать malloc():
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // Выделение памяти для одного целого числаКлючевые моменты:
- Всегда приводите возвращаемый указатель типа void к соответствующему типу данных
- Память остается доступной до тех пор, пока она не будет явно освобождена
- Обеспечивает гибкость при запросе точного объема памяти во время выполнения
- Используйте
sizeof()для определения правильного количества необходимых байтов
Попробуйте сами
#include <stdio.h>
#include <stdlib.h>
int main() {
// Чтение входных данных
int input_value;
scanf("%d", &input_value);
// TODO: Напишите свой код ниже
// 1. Используйте malloc() для выделения памяти для одного целого числа
// 2. Приведите возвращенный указатель к типу int*
// 3. Сохраните введенное значение в выделенной памяти
// 4. Выведите сохраненное значение
// 5. Вычислите и сохраните квадрат в том же месте
// 6. Выведите значение квадрата
return 0;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Основы указателей
Что такое указатель?Объявление указателейОператор взятия адреса (&)Оператор разыменования (*)Указатели NULLИтоги: Основы указателей4Проект: Простая текстовая утилита
Обзор проектаПодсчет символов2Указатели и массивы
Имена массивов как указателиЭлементы массива — указателиАрифметика указателейСравнение указателейИтоги: Обход массива через указатели5Указатели и функции
Передача по значениюПередача указателей в функцииИзменение переменных через указателиКлассический пример: SwapПередача массивов в функцииИтоги: указатели как аргументы функций8Структуры и указатели
Указатели на структурыОператор «стрелка» (->)Передача структур по значениюПередача указателей на структурыДинамическое выделение памяти для структурИтоги: Изменение структур через указатели11Итоговые задачи на повторение
Повторение: динамическая конкатенация строкПовторение: массив структурПовторение: счетчик частоты слов3Символьные массивы и строки
Строки как массивы charНуль-терминаторВвод строк с помощью scanfИспользование strlen()Использование strcpy()Использование strcat()Использование strcmp()Итоги: основные строковые функции6Управление памятью
Стек против кучиДинамическое выделение — malloc()Использование sizeof() для выделения памятиПроверка ошибок выделения памятиОсвобождение памяти с помощью free()Выделение памяти с помощью calloc()Итоги: Динамический массив