мета-данные страницы
  •  

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
c:c_ultimate_guide:setjmp.h [2025/10/31 13:13] radi0devc:c_ultimate_guide:setjmp.h [2025/11/09 12:07] (текущий) – внешнее изменение A User Not Logged in
Строка 15: Строка 15:
   * ''setjmp(env)'' — (по простому - сохраняет точку возврата) сохраняет текущий контекст в env и возвращает 0 при прямом вызове. При последующем возвращении, инициированном longjmp, setjmp возвращает ненулевое значение, переданное в longjmp.    * ''setjmp(env)'' — (по простому - сохраняет точку возврата) сохраняет текущий контекст в env и возвращает 0 при прямом вызове. При последующем возвращении, инициированном longjmp, setjmp возвращает ненулевое значение, переданное в longjmp. 
   * ''longjmp(env, val)'' — (по простому - возвращаеться в точку возврата) восстанавливает контекст, ранее сохранённый в env, и заставляет ранее вызванный setjmp((Если функция была вызвана без соответствующего вызова setjmp(), или функция, в которой восстанавливается выполнение, уже завершилась, то поведение не определено.)) вернуться с значением val (если val == 0, оно преобразуется в 1). Выполнение продолжается как будто setjmp только что вернуло это значение.   * ''longjmp(env, val)'' — (по простому - возвращаеться в точку возврата) восстанавливает контекст, ранее сохранённый в env, и заставляет ранее вызванный setjmp((Если функция была вызвана без соответствующего вызова setjmp(), или функция, в которой восстанавливается выполнение, уже завершилась, то поведение не определено.)) вернуться с значением val (если val == 0, оно преобразуется в 1). Выполнение продолжается как будто setjmp только что вернуло это значение.
 +
 +наглядное объяснение: {{:c:c_ultimate_guide:2025-10-31_13-23.png}}
  
 Использование setjmp() и longjmp() может привести к утечкам памяти, если выделение происходит между вызовами этих функций. Использование setjmp() и longjmp() может привести к утечкам памяти, если выделение происходит между вызовами этих функций.
 +
 +О памяти:
 +  * глобальные сохраняються
 +  * динамическая память остаеться как была
 +  * файлы и т.п. остаються как были
 +  * локальные непредсказуемы (если только их жестко не привязать к памяти через ''volatile''(никаких регистров и прочих оптимизаций))
  
 пример: пример: