Wskaźnik do funkcji w C — zmienna, w której przechowywany jest adres funkcji, pozwalająca dynamicznie wybierać, którą funkcję wywołać. Zwykła deklaracja wskaźnika do funkcji:
// Wskaźnik do funkcji przyjmującej int i zwracającej int int (*f_ptr)(int);
Dla tablicy wskaźników:
int func1(int x) { return x + 1; } int func2(int x) { return x * 2; } int (*f_arr[2])(int) = { func1, func2 }; int result = f_arr[1](10); // zwróci 20
Czy można za pomocą wskaźnika do funkcji wywołać funkcję o innej sygnaturze?
Częsta błędna odpowiedź: „Tak, jeśli użyć rzutowania typu”.
Prawidłowa odpowiedź: Techniką jest to możliwe ze względu na dynamiczną naturę wskaźników, jednak takie działanie prowadzi do błędów w czasie wykonywania i nieprzewidywalnego zachowania, ponieważ wywoływane są funkcje z różnymi konwencjami wywołań i kompozycją argumentów.
Przykład:
void funcA(int x) { printf("A: %d ", x); } void funcB(float y) { printf("B: %f ", y); } void (*fptr)(int) = (void (*)(int)) funcB; fptr(5); // BŁĄD: zostaną przekazane niewłaściwe dane
Historia
Historia
Historia
W firmware nie sprawdzano wyniku zmiany wskaźników do funkcji. Niewystarczająca inicjalizacja tablicy obsługi prowadziła do wywołania wskaźnika o wartości null (NULL), po czym urządzenie zawieszało się bez powiadomienia użytkownika.