0

私の知る限り、関数はメイン関数で呼び出された後、実行時までスタックに追加されません。

では、メモリ内に関数が存在しない場合、関数へのポインタはどのようにして関数のメモリ アドレスを持つことができるのでしょうか?

例えば:

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(){
}
4

1 に答える 1

1

関数は常にメモリ内にありますが、スタック上にはありません。これらは、プログラムの残りの部分と共にロードされるコードの一部であり、メモリの特別な読み取り専用セグメントに配置されます。

関数を呼び出すと、そのローカル変数 (引数を含む) のスペースがスタックに確保されます。

于 2013-06-30T04:21:08.660 に答える