如何让程序跳转到绝对地址去执行
我在网上看面试题目的时候发现一个题目:
让程序跳转到绝对地址0x100000去执行??
给出的答案千篇一律是:
*((void (*)( ))0x100000 ) ( );
首先要将0x100000强制转换成函数指针,即:
(void (*)())0x100000
然后再调用它:
*((void (*)())0x100000)();
用typedef可以看得更直观些:
typedef void(*)() voidFuncPtr;
*((voidFuncPtr)0x100000)();
问题是这个答案对吗???
为了验证我自己写了一段代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void getmemory(void)
{
printf("I am here.\n");
}
int main(void)
{
unsigned int p;
p=(unsigned int)&getmemory;
printf("%#x\n",&getmemory);
void (*pp)()=(void (*)())p;
void (*pp)()=getmemory;
pp();
//这个0x4012f0是第一次执行程序的时候getmemory的地址,运气好第二次它地址没变
//(*((void(*)())0x4012f0))();
// ((void(*)())0x4012f0)();
return 0;
}
由此可知,要想从0x100000执行,形式只能是: ((void (*)())0x100000)() 或者 (*((void (*)())0x100000))()
而网上给出的答案:
*((void (*)())0x100000)();是一个什么东西呢??这个形式编译根本都不可能通过。
我纳闷的是,几乎所有可以搜索到的答案都是这个错误的东西,
因为都这么说,所以虽然我的程序可以跑出结果,但是我还是不敢相信.....大家帮忙指正一下,是我理解失误???
还答案错了?
请指教,谢谢!
[解决办法]
没细看LZ的问题
((void (*)())0x100000)() ;
这个的确是合法的,只要内存0x100000是可执行且其中的程序是正确的就可以运行
而
*((void (*)())0x100000)();
应该是错误的
[解决办法]
我想他们的本意应该是
(*((void (*)())0x100000))()
-- 有点画蛇添足