czy bezpieczne jest przekazywanie wskaźników funkcji i porównywanie ich tak, jak normalnych wskaźników obiektów?
Oto rzecz, mam kilka funkcji,
void foo() {}
void bar() {}
I chcę przekazać te funkcje tak, jak wskaźniki zwykłych obiektów,
int main()
{
void (*fptr1)() = foo;
void (*fptr2)() = fptr1;
void (*fptr3)() = bar;
if (fptr1 == foo)
printf("foo function\n");
if (fptr2 == foo)
printf("foo function\n");
if (fptr3 == foo)
printf("foo function\n")
}
Czy mogę używać tych wskaźników funkcji w ten sposób? Napisałem program, aby go przetestować, wydaje się, że jest w porządku. Ponadto myślę, że nie jak zwykłe przedmioty, które mogą się w nim znajdowaćstack
lubheap
, funkcje znajdują się wtext segment
(prawda?), więc kiedy się odwołujęfoo
, czy daje mi fizyczny adres przy której funkcjifoo
leży w segmencie tekstu?
ZAGRYŹĆ
Jeśli rzeczywiście pracuję z biblioteką DLL, rozważ to: najpierw funkcję ptrfptr
przypisana jest funkcja,
ReturnType (*fptr)(ArgType) = beautiful_func;
Dwa scenariusze tutaj
1) jeśli beautiful_func nie jest w DLL, można bezpiecznie z niego korzystaćfptr
.
2) jeśli jest w bibliotece DLL, to później myślę, że byłoby niebezpiecznefptr
, ponieważ teraz może odnosić się do zupełnie innej funkcji, która nie jestfptr
urodził się dla, prawda?