Стек против кучи
Часть раздела Logic & Flow путешествия по C на Coddy — урок 31 из 63.
Когда ваша программа на языке C выполняется, она использует две различные области памяти: стек и кучу. Понимание разницы между этими областями памяти имеет решающее значение для эффективного программирования на C, особенно при работе с указателями и динамическим выделением памяти.
Стек используется для статического выделения памяти. Здесь хранятся ваши локальные переменные, параметры функций и информация о вызовах функций. Стек управляется системой автоматически — когда вы объявляете локальную переменную, память выделяется в стеке, а когда переменная выходит из области видимости, эта память автоматически освобождается.
void function() {
int x = 10; // Выделяется в стеке
char arr[100]; // Также выделяется в стеке
// Память автоматически освобождается при завершении функции
}Куча используется для динамического выделения памяти. Это более обширная область памяти, которую можно запрашивать во время выполнения программы.
В отличие от стека, куча требует ручного управления — вы должны явно запрашивать память и позже освобождать её, когда закончите. Это дает вам больше контроля, но также и больше ответственности.
Ключевое различие заключается в управлении: стековая память управляется автоматически и ограничена в размере, в то время как куча управляется вручную и имеет гораздо больший объем. В следующих уроках вы узнаете, как работать с кучей, используя такие функции, как malloc() и free().
Шпаргалка
Программы на языке C используют две различные области памяти:
Стек (Stack): Используется для статического выделения памяти. Хранит локальные переменные, параметры функций и информацию о вызовах функций. Память управляется автоматически — выделяется при объявлении переменных и освобождается, когда они выходят из области видимости.
void function() {
int x = 10; // Выделяется в стеке
char arr[100]; // Также выделяется в стеке
// Память автоматически освобождается при завершении функции
}Куча (Heap): Используется для динамического выделения памяти. Представляет собой больший пул памяти, требующий ручного управления — вы должны явно запрашивать и освобождать память с помощью таких функций, как malloc() и free().
Ключевое различие: Память в стеке управляется автоматически и ограничена в размере, в то время как память в куче управляется вручную и имеет гораздо больший объем.
Попробуйте сами
В этом уроке нет задания по программированию.
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Основы указателей
Что такое указатель?Объявление указателейОператор взятия адреса (&)Оператор разыменования (*)Указатели NULLИтоги: Основы указателей4Проект: Простая текстовая утилита
Обзор проектаПодсчет символов2Указатели и массивы
Имена массивов как указателиЭлементы массива — указателиАрифметика указателейСравнение указателейИтоги: Обход массива через указатели5Указатели и функции
Передача по значениюПередача указателей в функцииИзменение переменных через указателиКлассический пример: SwapПередача массивов в функцииИтоги: указатели как аргументы функций8Структуры и указатели
Указатели на структурыОператор «стрелка» (->)Передача структур по значениюПередача указателей на структурыДинамическое выделение памяти для структурИтоги: Изменение структур через указатели11Итоговые задачи на повторение
Повторение: динамическая конкатенация строкПовторение: массив структурПовторение: счетчик частоты слов3Символьные массивы и строки
Строки как массивы charНуль-терминаторВвод строк с помощью scanfИспользование strlen()Использование strcpy()Использование strcat()Использование strcmp()Итоги: основные строковые функции