setjmp.h

заголовочник объявляющий макросы и тип данных для нелокальных переходов. В Си существует оператор goto, позволяющий переходить в любое место в пределах функции (с некоторыми оговорками), однако переход между функциями с его помощью невозможен.

определения:

#include <setjmp.h>
int setjmp(jmp_buf env);
void longjmp(jmp_buf env, int val);

описание:

наглядное объяснение:

Использование setjmp() и longjmp() может привести к утечкам памяти, если выделение происходит между вызовами этих функций.

О памяти:

пример:

#include <stdio.h>
#include <setjmp.h>
 
static jmp_buf buf;
 
void second(void) {
  printf("вторая функция: собираюсь longjmp\n");
  longjmp(buf, 42);
}
 
void first(void) {
  second();
  printf("это не будет выполнено\n");
}
 
int main(void) {
  int val = setjmp(buf);
 
  if (val == 0) {
    printf("setjmp вернул 0 — нормальный путь\n");
    first();
  } else {
    printf("setjmp вернул %d — вернулись из longjmp\n", val);
  }
 
  return 0;
}
1)
Если функция была вызвана без соответствующего вызова setjmp(), или функция, в которой восстанавливается выполнение, уже завершилась, то поведение не определено.