私は何か遭遇しました。私は完全に理解しません。 関数のプロトタイプがあります:GCCの関数ポインタ、アドレスの割り当て
typedef void (* TMain) (void);
と関数の変数:
TMain myFunc = MyFunc;
...
myFunc();
もちろんこれは、正常に動作します。それはなぜではありませんか?
MAPファイルから「MyFunc」は場所0x20100にあることがわかりました。 そして今、面白いことです。割り当て後、 "myFunc = MyFunc;"変数 "myFunc" は0x20100という値を含むではなく、むしろ0x20101です!
私の問題は、テーブルからアドレスを知っている関数を呼び出す必要があることです。だから私は、私はそれが動作する
myFunc = (TMain) ((Int8 *) myTable [ 5 ] + 1);
myFunc();
をすれば、私はしかしその
myFunc = (TMain) myTable [ 5 ]; // that would be 0x20100
myFunc(); // which produces a proper crash
のようにそれを行うことができると思いました。
ここではどうなりますか?私はいつも1のオフセットを加えなければならないのでしょうか、これは多かれ少なかれ偶然ですか? タスクを達成するためのより良い(そして働く)方法がありますか?
ありがとうございました。 Walter
わかりませんが、これはアーキテクチャに依存する可能性があります。だから、どのアーキテクチャがターゲットアーキテクチャであるかを言いたいかもしれません。 – phimuemue
'TMain []'型の 'myTable'配列はありますか?あなたがそれをキャストしているからではないと推測します。 –
いくつかの質問があります:どのプラットフォームを使用していますか(ARM、x86 ...)?あなたはデバッガで関数の実際のアドレスをチェックしたことがありますか?コンパイラが間接呼び出し "myFunc()"をどのように生成するかを見ることができますか? –