Un puntatore a funzione in C è una variabile che memorizza l'indirizzo di una funzione, consentendo di scegliere dinamicamente quale funzione chiamare. La dichiarazione di un puntatore a funzione normale è:
// Puntatore a funzione che prende un int e restituisce un int int (*f_ptr)(int);
Per un array di puntatori:
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); // restituirà 20
Si può chiamare una funzione con un'altra firma utilizzando un puntatore a funzione?
Risposta errata comune: "Sì, se si utilizza il casting del tipo".
Risposta corretta: Tecnologicamente è possibile a causa della natura dinamica dei puntatori, ma tale azione porta a bug a runtime e comportamenti imprevedibili, poiché vengono chiamate funzioni con differenti convenzioni di chiamata e composizione degli argomenti.
Esempio:
void funcA(int x) { printf("A: %d\n", x); } void funcB(float y) { printf("B: %f\n", y); } void (*fptr)(int) = (void (*)(int)) funcB; fptr(5); // ERRORE: verranno passati dati errati
Storia
Storia
Storia
Nel firmware non è stato controllato il risultato della modifica dei puntatori a funzioni. Un'inizializzazione insufficiente dell'array di gestori ha portato alla chiamata di un puntatore nullo (NULL), dopo di che il dispositivo si bloccava senza notificare l'utente.