C Programlama #40 | Fonksiyon İşaretçisi Dizisi ve Güvenli C
İşaretçiler (Pointers)Eğitmen: Dr. Süleyman Burak ÇELİK
Dört işlemli bir hesap makinesi: 0 toplama, 1 çıkarma, 2 çarpma, 3 bölme. Seçime göre dallanmak yerine seçimin kendisini dizinin indisi yapabilir miyiz? Kırkıncı derste fonksiyon işaretçilerini bir diziye koyup bir menü yazıyor, sonra işaretçilerle güvenli çalışmanın kurallarıyla işaretçiler bölümünü kapatıyoruz. int (*islem[4])(int a, int b) = {topla, cikar, carp, bol}; bildirimini içten dışa okuyoruz: islem[4] dört elemanlı bir dizi, yıldız her elemanın işaretçi olduğunu, (int a, int b) gösterdiği fonksiyonun iki int aldığını, en baştaki int de int döndürdüğünü söylüyor. Yanındaki ad dizisi 38. dersten tanıdık bir işaretçi dizisi. Çağrı satırı (*islem[secim])(12, 4): menüde 0 → topla(12, 4) = 16, 1 → cikar 8, 2 → carp 48, 3 → bol 3; 4 dizinin dışında kaldığı için döngü bitiyor. Döngü koşulu yalnızca menüyü bitirmek için değil: islem[7] dizinin dışından 8 bayt okur ve onu çağırmak programı rastgele bir adrese atlatır; indisi her zaman denetleyin. Bir tuzak daha: sayı yerine x yazınca scanf okuyamaz, x girişte kalır, seçim 0 kalır ve program sonsuza kadar topla yazar (çıktıyı gerçek bir boruyla, head ile ilk üç satırda kesiyoruz). Düzeltme tek satır: döngü koşuluna scanf(...) == 1 eklemek; x yazınca program hemen bitti diyor, sayılarla eskisi gibi çalışıyor. Ardından NULL bir fonksiyon işaretçisini çağırıyoruz: zsh segmentation fault diyor, çıkış kodu 139 = 128 + 11; lldb'de program 0 adresine atlamış (pc = 0), dönüş adresi bizi main'deki çağrı satırına götürüyor; çare çağırmadan önce NULL denetimi. Son olarak C standardının isteğe bağlı eki Annex K'ye (printf_s, scanf_s) bakıyoruz: bu Mac'te gcc ve clang'da, Linux sunucumuzda da yok; scanf_s derlenmiyor bile. Taşınabilir yol dönüş değerlerini denetlemek; kitap ayrıca CERT kurallarını öneriyor. Ekrandaki her çıktı, kodun gerçekten derlenip çalıştırılmasından geliyor. Bu derste: 1. Fonksiyon işaretçisi dizisi: seçim indis olur 2. İndisi denetlemek: dizinin dışı rastgele bir adres 3. scanf'in dönüş değeri: okunamayan girdi döngüyü kilitler 4. NULL fonksiyon işaretçisi: segmentation fault, lldb'de pc = 0 5. Annex K isteğe bağlı; CERT kuralları Bölümler: 0:00 Fonksiyon işaretçisi dizileri 0:17 Hesap makinesi: dallanmak mı, seçmek mi? 0:45 Fonksiyon işaretçisi dizisi 1:24 Seçim indis olur 1:56 İndisi denetle 2:21 Tuzak: scanf'in dönüş değeri 2:47 Düzeltme: dönüş değerini denetle 3:15 NULL bir fonksiyon işaretçisini çağırmak 3:48 Annex K: güvenli sürümler isteğe bağlı 4:25 Bugünün dört kuralı 4:50 Sonraki bölüm: karakterler ve metinler Kaynak kitap: Paul Deitel, Harvey Deitel — C How to Program, 9. baskı (2022), §7.12.2–7.13. Konu sırası ve kavramlar kaynak kitaptan izlenir; anlatım, örnekler ve ekranlar özgündür. Hedef kitle: C'ye yeni başlayan tüm mühendislik ve bilgisayar/yazılım öğrencileri. Ön koşul: C Programlama #01–#39.
Bu videoyu izlemek için Premium üyelik gerekir.