2011-09-08 11 views
12

Jeśli przechowuję wskaźnik do funkcji, a następnie w pewnym późniejszym momencie podczas wykonywania mojego programu, porównaj go z adresem tej samej funkcji, czy oba adresy są równe.Czy funkcje C mają stały adres pamięci?

E.g.

int foo(void){return 0;} 
int (*foo_p)(void) = &foo; 

assert(foo_p == &foo); 

W powyższym kodzie jest twierdzenie zawsze gwarantowane, aby odnieść sukces? Czy są jakieś warunki, pod którymi adres funkcji może się zmienić?

Odpowiedz

17

Per 6.5.9:

Dwa wskaźniki porównać równe wtedy i tylko wtedy, gdy oba wskaźniki są zerowe, oba są wskaźniki do tego samego obiektu (w tym wskaźnik do obiektu i podobiektu na jego początku) lub funkcja, oba są wskaźnikami do jednego za ostatnim elementem tego samego obiektu tablicy, lub jeden jest wskaźnikiem do jednego za końcem jednego obiektu tablicy, a drugi jest wskaźnikiem do początku innego obiektu tablicy, zdarza się natychmiast podążać za pierwszym obiektem tablicy w przestrzeni adresowej.

(Boldface dodany naciskiem.)

0

adres funkcja nigdy się nie zmieni. Wiele programów opiera się na koncepcji wywołań zwrotnych, które nie działałyby, gdyby adres funkcji mógł się zmienić.

Jeśli, hipotetycznie, zmieni się lokalizacja danej funkcji, na przykład przez program samoczynnie modyfikujący, wówczas wszystkie wywołania tej funkcji spowodują w każdym razie zachowanie segfault lub bardzo niezdefiniowane. Edycja: Wyjaśnienie - symbole funkcyjne są jak wskaźniki, jeśli pamięć free wskazywana przez wskaźnik, która nie wyzeruje rzeczywistej zmiennej wskaźnika, nadal będzie wskazywać, tak jak wywołania funkcji będą nadal wskazywać na starą lokalizację przeniesionego obiektu funkcjonować.

Programy samoczynnie modyfikujące są bardzo dużymi wyjątkami, a w dzisiejszych czasach sekcja kodu pliku binarnego jest chroniona przed zapisem, co jest bardzo, bardzo trudne.

Powiązane problemy