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

Различия

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

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

Следующая версия
Предыдущая версия
c:c_ultimate_guide:setjmp.h [2025/10/31 12:57] – создано radi0devc:c_ultimate_guide:setjmp.h [2025/11/09 12:07] (текущий) – внешнее изменение A User Not Logged in
Строка 13: Строка 13:
  
   * ''jmp_buf'' — тип данных, представляющий сохранённое состояние выполнения (контекст), включая регистры, указатель стека и указатель инструкции. Размер и содержимое зависят от реализации.   * ''jmp_buf'' — тип данных, представляющий сохранённое состояние выполнения (контекст), включая регистры, указатель стека и указатель инструкции. Размер и содержимое зависят от реализации.
-  * ''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''(никаких регистров и прочих оптимизаций))
  
 пример: пример: