我从互联网上找到了这个解决方案。
#include <stdio.h>
#include <stdlib.h>
int n = 0;
void first() {
void* x;
printf("%d\n", ++n);
if (n >= 100) {
exit(0);
}
*((char**) (&x + 4)) -= 5;
}
int main() {
first();
return 1;
}
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释该行的含义*((char**) (&x + 4)) -= 5;吗?
这种练习完全没有意义。话虽如此,您的“黑客”似乎正在尝试模拟 的行为setjmp/longjmp,它存储/恢复执行环境的状态,例如程序计数器。
// Silly code to solve artificial problems. Don't write programs like this.
#include <stdio.h>
#include <setjmp.h>
void silly_print (int max)
{
jmp_buf jb;
int n = setjmp(jb);
printf("%d\n", ++n);
if(n < max)
{
longjmp(jb, n);
}
}
int main()
{
silly_print(100);
}
Run Code Online (Sandbox Code Playgroud)
注意: setjmp/longjmp被认为是危险的,因为它们可能会导致各种意想不到的副作用。它们也被认为是不好的做法,因为它们可以用于意大利面条式编程,如上面的代码所示