函数指针强转 c语言,函数指针的强制转换用法

2004年7月的一天,在电子BBS讨论区上溜达,看到一个有趣的帖子,整个帖子内容如下:

纯C51复位功能函数:一个大三学生,让人又爱又怕

现单列复位部分如下:

main()

{

unsigned char code rst[]={0xe4,0xc0,0xe0,0xc0,0xe0,0x32}; // 复位代码

(*((void (*)())(rst)))(); // 执行上一行代码,将rst数组当函数调用

}

本来我告诉他嵌入如下代码:

clr a

push acc

push acc

reti

结果他却玩了前面哪一段,而数组rst[]中的内容恰恰是上面的汇编机器码,他的做法是将

rst数组的数据当作代码保存,然后采用绝对地址方式指向该数组,将该数组中的代码当作

函数来运行。居然通过了!

我觉得有问题,我说即使如此,那绝对地址调用也应该写成(*((void (*)())(&rst)))()

才对呀,结果他反驳说,那样的话,rst的地址就会当成参数传递给这个绝对地址函数,而

实际LJMP调用的地址并非rst的地址,而是一个不确定的地址。于是我按照自己的说法尝试

了一下,看看汇编结果,还真的是将rst的地址传递给了R1 R2,而绝对函数最终LJMP到了

一个莫名其妙的地址上去了,死翘!

看来C真是一匹不容易驾驭的野马,这个大三学生理解力在我之上,我30多岁的人了,干了

这么多年还没他的境界呢,唉,人家才学了几天啊,翻了几天书就这么厉害了,服了!

l 首先分析帖子的C语言代码

第一句定义一个数组rst[],数组内数据就是完成复位功能的汇编机器码,具体对应关


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部