Menu
Coddy logo textTech

Динамическое выделение — 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 к типу данных, с которым вы работаете.

challenge icon

Задание

Легко

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

  1. Использовать malloc() для динамического выделения памяти для одного целого числа
  2. Привести возвращаемый указатель типа void к указателю на целое число
  3. Считать целое число из пользовательского ввода
  4. Сохранить введенное значение в динамически выделенной памяти, используя оператор разыменования
  5. Вывести сохраненное значение в формате: Stored value: [value]
  6. Вычислить и сохранить квадрат этого значения в ту же область памяти
  7. Вывести квадрат значения в формате: 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;
}
quiz iconПроверьте себя

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

Все уроки раздела Logic & Flow