私の知る限り、関数はメイン関数で呼び出された後、実行時までスタックに追加されません。
では、メモリ内に関数が存在しない場合、関数へのポインタはどのようにして関数のメモリ アドレスを持つことができるのでしょうか?
例えば:
using namespace std;
#include <iostream>
void func() {
}
int main() {
void (*ptr)() = func;
cout << reinterpret_cast<void*>(ptr) << endl; //prints 0x8048644 even though func never gets added to the stack
}
また、この次の質問は私にとってはあまり重要ではないので、最初の質問の答えだけを知っていれば問題ありません。しかし、とにかく、関数プロトタイプを宣言し、main の後に関数を実装すると、ポインターの値 (関数のメモリ アドレス) が異なるのはなぜですか?
最初の例では、プログラムを何回実行しても 0x8048644 が出力されました。次の例では、プログラムを何回実行しても 0x8048680 が出力されました。
例えば:
using namespace std;
#include <iostream>
void func();
int main() {
void ( *ptr )() = func;
cout << reinterpret_cast<void*>(ptr) << endl;
}
void func(){
}