ProgrammatieSysteemprogrammer

Wat zijn de kenmerken van het declareren en gebruiken van functiepointers in C? Hoe sla je correct een array van pointers naar verschillende functies op en roep je deze dynamisch aan?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

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
  • Deze aanpak maakt het mogelijk om commandotabellen, handlers of automatisch acties aan een operatienummer te koppelen.
  • Alle functies moeten dezelfde handtekening hebben.
  • Bij het werken met functiepointers moeten de types exact overeenkomen.

Vraag met een valstrik

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

Voorbeelden van echte fouten als gevolg van gebrek aan kennis van de nuances van het onderwerp


Verhaal

In een plugin-systeemproject werden functie pointers met verschillende handtekeningen in de tabel geplaatst (de ene retourneerde int, de andere void). Bij uitvoering op sommige architecturen leidde dit tot stackcorruptie.

Verhaal

In een oud commando-beheersysteem werd een array van functie pointers gebruikt. Een nieuwkomer voegde een functie met extra parameters toe, wat leidde tot onvoorspelbaar gedrag na de overgang naar een nieuw element in de array.

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.