Насколько мне известно, функции не добавляются в стек до времени выполнения после их вызова в основной функции.
Так как же указатель на функцию может иметь адрес памяти в функции, если он не существует в памяти?
Например:
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(){
}
Функции всегда в памяти, но не в стеке. Они являются частью кода, загружаемого вместе с остальной частью программы, и помещаются в специальный сегмент памяти только для чтения.
Когда ты вызов функция, затем место для ее локальных переменных (включая аргументы) зарезервированы в стеке.
Других решений пока нет …