Какие виды памяти есть в C и чем они отличаются
Что проверяют
Для тестировщика это вопрос не про синтаксис C, а про то, откуда берутся самые тяжёлые дефекты: падения, утечки, порча данных. Следом обычно спрашивают, какие ошибки с памятью вы встречали и чем их ловить.
Как отвечать
Начните с того, что стандарт C говорит не о «видах памяти», а о времени жизни объектов (storage duration). На практике им соответствуют области памяти процесса:
- автоматическая (стек): локальные переменные и параметры функций. Появляется при входе в блок и исчезает при выходе. Размер ограничен: на Linux основному потоку по умолчанию дают 8 МБ, на Windows 1 МБ;
- динамическая (куча):
malloc,calloc,realloc, освобождение черезfree. Живёт, пока её явно не освободят, размер задаётся во время работы; - статическая: глобальные переменные и переменные с
static. Живут всё время работы программы, неинициализированные лежат в.bssи обнуляются, инициализированные в.data; - только для чтения: строковые литералы и константы в
.rodata. Запись туда это неопределённое поведение, обычно падение; - потоковая:
_Thread_localиз C11, у каждого потока своя копия.
«Глобальная память» отдельным видом не является: это та же статическая память, видимая из других файлов.
Дальше свяжите с тестированием. У каждой области свои дефекты: переполнение стека при глубокой рекурсии, возврат указателя на локальную переменную, утечки, двойной free, обращение после освобождения, выход за границы буфера. Ловят их инструментами: Valgrind (memcheck), сборка с -fsanitize=address (AddressSanitizer вместе с детектором утечек) и -fsanitize=undefined. Сильный ход: предложить гонять автотесты ещё и на отдельной сборке с санитайзерами.
Где спотыкаются
Говорят, что куча «медленнее по доступу». Медленнее выделение и освобождение, а чтение уже выделенной памяти идёт с той же скоростью.
Путают утечку и порчу памяти. Утечка копит расход, а обращение после free может годами работать «нормально» и упасть на другой машине.
Считают, что раз тест прошёл, с памятью всё хорошо. Неопределённое поведение часто не проявляется без санитайзера или Valgrind.