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