首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2013-03-06 
如何让程序跳转到绝对地址去执行我在网上看面试题目的时候发现一个题目:让程序跳转到绝对地址0x100000去执

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

热点排行