ProgramlamaSistem Programcısı

C'de fonksiyon göstericilerinin ilanı ve kullanımıyla ilgili özellikleri açıklayın. Farklı fonksiyonlar için gösterici dizilerini nasıl doğru bir şekilde saklayabilir ve dinamik olarak nasıl çağırabilirsiniz?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

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
  • Bu yaklaşım, komut tabloları, işleyiciler yaratmaya veya işlemlerin numarası ile otomatik olarak eylemleri bağlamaya olanak tanır.
  • Tüm fonksiyonların aynı imzaya sahip olması gerekir.
  • Fonksiyon göstericileri ile çalışırken türler tam olarak eşleşmelidir.

Beklenmeyen Soru

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

Bilinçsizce yapılan hatalarla ilgili gerçek örnekler


Hikaye

Eklenti sistemi projesinde, farklı imzalara sahip fonksiyonların gösterici tablolarına yerleştirildiği bir durum oldu (biri int döndürüyordu, diğeri void). Bazı mimarilerde çalıştırıldığında, stack bozulması meydana geldi.

Hikaye

Eski komut yönetim sisteminde, fonksiyon göstericileri dizisi kullanıldı. Yeni bir çalışan, ek parametreler içeren bir fonksiyon ekledi; bu, diziye geçiş yaptıktan sonra öngörülemez bir yürütmeye neden oldu.

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ı.