В языке C переменные с автоматической областью хранения (auto, по умолчанию) создаются на стеке при входе в область их видимости (обычно — функцию) и автоматически уничтожаются при выходе из неё.
К особенностям относятся:
Пример корректного и некорректного использования:
int* wrong() { int x = 42; return &x; // ОШИБКА: x уничтожится после выхода из функции } void correct() { int y = 123; printf("%d ", y); // всё хорошо }
Что произойдёт, если вернуть из функции адрес локальной переменной?
Частый неверный ответ: «Указатель сохранит значение».
Правильный ответ: Возвращённый адрес станет невалидным после выхода из функции, область памяти будет вновь выделена под другие автоматические переменные или функции. Использование такого указателя — неопределённое поведение.
Пример:
int* myfunc() { int temp = 10; return &temp; // temp уничтожается после возврата } int main() { int* p = myfunc(); printf("%d ", *p); // НЕОПРЕДЕЛЁННОЕ ПОВЕДЕНИЕ }
История
История
История
В прошивке медицинского регистратора был реализован кеш на стеке для ускорения обработки данных. При нагрузке стек переполнялся, что приводило к перезагрузке устройства и потере данных пациента.