これは、Windows 7 64 ビットで VC++ 2010 で C 言語を使用しています。
プログラムを実行するたびに同じアドレスになるように、関数のアドレス (c リンケージ) に確実かつ一貫してアクセスする方法はありますか?
これは、Windows 7 64 ビットで VC++ 2010 で C 言語を使用しています。
プログラムを実行するたびに同じアドレスになるように、関数のアドレス (c リンケージ) に確実かつ一貫してアクセスする方法はありますか?
実行時にアドレスを取得した場合、その実行中は安定したままになるはずです。次回は違うかもしれません。
OS には、実行可能コードが予測できないアドレスに読み込まれる可能性がある機能があります (セキュリティ上の理由や、2 つの DLL が同じベース アドレスを必要とする可能性があるため)。
いいえ、ほとんどの最新の OS では、関数が毎回同じアドレスにロードされるという保証がないためです。一部の組み込みデバイスでは、リンカー ファイルで関数の固定アドレスが定義されていれば、これを回避できる場合があります。
しかし、なぜわざわざ?変数の場合と同じように、関数のアドレスを取得できます。
void func(int a)
{
a=5;
}
void main()
{
// In case you don't know or don't care about the signature of the function.
void* p = func;
// In case you do care and might want to call the function
// at some point through the pointer.
void (*f)(int) = func;
printf("%p %p",p, f);
}