/* go_or_back.c */ unsigned _mark; void mark() { int dummy; _mark = *(unsigned *)(&dummy + 2); // 2‚͊‹«‚Ɉˑ¶ } unsigned _target; void jump() { int dummy; unsigned *p_ret_addr = (unsigned *)(&dummy + 2); *p_ret_addr = _target; } main() { int c = 3; unsigned first, second; printf("Enter main.\n"); mark(); first = _mark; printf("first: c = %d\n", c); mark(); second = _mark; printf("second: c = %d\n", c); c--; printf("\ngo or back? c = %d\n\n", c); switch (c) { case 2: _target = first; jump(); break; case 1: _target = second; jump(); break; default: ; } printf("Leave main. c = %d\n", c); }