zul*_*shi 0 c algorithm pointers
我从互联网上找到了这个解决方案,但我无法理解.
#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;什么?
还有其他方法不那么复杂吗?
"诀窍"在于
*((char**) (&x + 4)) -= 5;
Run Code Online (Sandbox Code Playgroud)
这x会将内存更改为超出存储位置的4个字节,并将其减少5.
假设这段代码适合你,它正在改变函数的返回地址,大概是这样的,而不是返回到行的main
return 1
Run Code Online (Sandbox Code Playgroud)
它改为返回到该行
first();
Run Code Online (Sandbox Code Playgroud)
也就是说,它依赖于处理器的知识,堆栈帧布局和编译器的输出来合成类似于goto语句的东西.
所以,重写
*((char**) (&x + 4)) -= 5;
Run Code Online (Sandbox Code Playgroud)
在英语中,它看起来像"改变我回归的地方,早先是一个声明." 这是一个噱头,而不是你将来可以依赖的东西.