我从互联网上找到了这个解决方案。
#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;
}
有人可以解释一下*((char**) (&x + 4)) -= 5;
行的含义吗?
答案 0 :(得分:4)
这项运动毫无意义。话虽如此,它似乎是你的&#34; hack&#34;试图模拟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);
}
注意: setjmp/longjmp
被认为是危险的,因为它们可能会导致各种意外的副作用。它们也被认为是不好的做法,因为它们可用于意大利面条编程,如上面的代码所述