Een functiepointer in C is een variabele die het adres van een functie opslaat en het mogelijk maakt om dynamisch te kiezen welke functie op te roepen. Een gebruikelijke declaratie van een functiepointer:
// Pointer naar een functie die int accepteert en int retourneert int (*f_ptr)(int);
Voor een array van pointers:
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); // retourneert 20
Kun je met een functiepointer een functie met een andere handtekening aanroepen?
Veelvoorkomend verkeerd antwoord: "Ja, als je typecast gebruikt".
Juiste antwoord: Technisch gezien is het mogelijk vanwege de dynamische aard van pointers, maar deze actie leidt tot runtime-fouten en onvoorspelbaar gedrag, omdat functies met verschillende aanroep- en argumentverzendingsovereenkomsten worden aangeroepen.
Voorbeeld:
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); // FOUT: er worden verkeerde gegevens verzonden
Verhaal
Verhaal
Verhaal
In de firmware werd het resultaat van het wijzigen van functie pointers niet gecontroleerd. Onvoldoende initialisatie van de handler-array leidde tot het aanroepen van een null pointer (NULL), waarna het apparaat vastliep zonder de gebruiker te waarschuwen.