Как указатели на функции могут указывать на то, что еще не существует в памяти? Почему прототипы имеют разные адреса?

Насколько мне известно, функции не добавляются в стек до времени выполнения после их вызова в основной функции.

Так как же указатель на функцию может иметь адрес памяти в функции, если он не существует в памяти?

Например:

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

0

Решение

Функции всегда в памяти, но не в стеке. Они являются частью кода, загружаемого вместе с остальной частью программы, и помещаются в специальный сегмент памяти только для чтения.

Когда ты вызов функция, затем место для ее локальных переменных (включая аргументы) зарезервированы в стеке.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]