我希望程序跳转到内存中的特定地址,并从该地址继续执行。我考虑过使用goto,但我在内存中没有标签,只有一个地址。
不需要担心从跳转地址返回。
编辑:使用GCC编译器
发布于 2011-11-17 04:16:32
内联汇编可能是最简单和最“优雅”的解决方案,尽管这样做是非常不寻常的,除非您正在编写调试器或一些专门的内省系统。
另一种选择可能是声明一个指向空函数(void (*foo)(void))的指针,然后将该指针设置为包含您的地址,然后调用它:
void (*foo)(void) = (void (*)())0x12345678;
foo();由于编译器认为你正在执行子例程调用,所以会有一些东西被推到堆栈上,但由于你并不关心返回,所以这可能会起作用。
发布于 2013-06-14 06:48:45
gcc有一个允许跳转到任意地址的扩展:
void *ptr = (void *)0x1234567; // a random memory address
goto *ptr; // jump there -- probably crash这与使用设置为固定值的函数指针几乎相同,但它实际上将使用跳转指令而不是调用指令(因此堆栈不会被修改)
发布于 2011-11-17 04:46:02
#include <stdio.h>
#include <stdlib.h>
void go(unsigned int addr) {
(&addr)[-1] = addr;
}
int sub() {
static int i;
if(i++ < 10) printf("Hello %d\n", i);
else exit(0);
go((unsigned int)sub);
}
int main() {
sub();
}当然,这调用了未定义的行为,依赖于平台,假设代码地址与int的大小相同,等等。
https://stackoverflow.com/questions/8158007
复制相似问题