读书人

怎么让程序跳转到绝对地址去执行

发布时间: 2013-03-06 16:20:31 作者: rapoo

如何让程序跳转到绝对地址去执行
我在网上看面试题目的时候发现一个题目:
让程序跳转到绝对地址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))()
-- 有点画蛇添足

读书人网 >C语言

热点推荐