我遇到了我彻底不明白的东西。 有一个函数原型:功能指针与海湾合作委员会,分配地址
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的偏移量,或者这或多或少是偶然的? 还是有更好的(和工作)的方式来完成任务?
非常感谢任何提示。 Walter
不确定,但这可能取决于架构。所以可能想说哪个是目标架构。 – phimuemue 2012-02-01 09:34:35
是'TMain []''类型的myTable'数组吗?我认为这不是因为你在投它。 – 2012-02-01 09:35:36
对你有些问题:你在使用什么平台(ARM,x86 ...)?你有没有用调试器检查函数的实际地址?你能看到编译器如何生成间接调用“myFunc()”吗? – 2012-02-01 09:39:20