C'de fonksiyon göstericisi, bir fonksiyonun adresini saklayan bir değişkendir ve hangi fonksiyonun çağrılacağını dinamik olarak seçmeye olanak tanır. Fonksiyon göstericisinin normal ilanı:
// int alan ve int döndüren fonksiyon göstericisi int (*f_ptr)(int);
Göstericiler dizisi için:
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); // 20 döndürecek
Fonksiyon göstericisi aracılığıyla başka bir imzaya sahip fonksiyonu çağırmak mümkün mü?
Sık karşılaşılan yanıt: «Evet, tür dönüşümü kullanarak».
Doğru yanıt: Teknik olarak mümkün, ancak bu işlem runtime hatalarına ve öngörülemeyen davranışlara yol açar, çünkü farklı çağrı ve argüman düzenleme anlaşmalarına sahip fonksiyonlar çağrılmaktadır.
Örnek:
void funcA(int x) { printf("A: %d ", x); } void funcB(float y) { printf("B: %f ", y); } void (*fptr)(int) = (void (*)(int)) funcB; fptr(5); // HATA: yanlış veriler iletilecek
Hikaye
Hikaye
Hikaye
Firmware'de, fonksiyon göstericilerinin değişiminin sonucunu kontrol edilmedi. İşleyici dizisinin yetersiz bir şekilde başlatılması, NULL işaretçisinin çağrılmasına neden oldu; bu da cihazın kullanıcının haberi olmadan durmasına yol açtı.