If a signal occurs and the implementation does not use a separate signal stack, the frame for the signal handler overwrites something below the current frame. This is, of course, not the only thing, which can alter the stack. Coroutines can be implemented with structs to hold the state and ordinary function calls.