Wal*_*ter 6 c gcc function-pointers
我遇到了一些我完全不明白的事情.有一个函数原型:
typedef void ( * TMain ) ( void );
和一个函数变量:
TMain myFunc = MyFunc;
...
myFunc ();
当然,这很好用.为什么不呢.
从MAP文件我知道"MyFunc"位于0x20100位置.而现在有趣的事情.在赋值"myFunc = MyFunc;"之后 变量"myFunc" 不包含值0x20100而是0x20101!
我的问题是,我需要调用一个函数,我从表中知道地址.所以我想我可以这样做
myFunc = ( TMain ) myTable [ 5 ];    // that would be 0x20100
myFunc ();                           // which produces a proper crash
但是,如果我这样做
myFunc = ( TMain ) ( ( Int8 * ) myTable [ 5 ] + 1 );  
myFunc ();
然后它工作.
这里发生了什么?我是否总是要添加1的偏移量,或者这或多或少是偶然的?或者有更好的(和工作)方式来完成任务?
非常感谢任何提示.沃尔特
一些 CPU 架构保留函数的第一个字节用于特定目的。VAXen 那里有一个保存寄存器掩码。CDC Cyber 将返回地址放在那里。有些使用“地址”的某些位来指示地址间接(我不记得是哪些,但它们来自 20 世纪 70 年代)。
除非您真正知道自己在做什么,否则不应编写执行此类指针算术的代码。为变量分配函数名称并完成它:保证在每个C实现上都有效。