C: işaretçiler ve bellek yönetimi
İşaretçileri ve dinamik belleği doğru kullanır, taşma ve bellek sızıntısı gibi hataları araçlarla bulup önlersin.
Seviye 201 · 22 ders · 21 pratik lab
Dersler
İşaretçiler
- Bellek modeli: yığın, öbek ve adresler: Bir programın belleğinin nasıl bölündüğünü ve değişkenlerin adreslerini yazdırarak görürsün.
- İşaretçi temelleri: & ve * işleçleri: Adres alır, işaretçi üzerinden değere ulaşır ve NULL işaretçiyi denetlemenin önemini öğrenirsin.
- İşaretçiler ve diziler: adres aritmetiği: Dizi ile işaretçi arasındaki ilişkiyi ve işaretçiyi ilerletmenin sınır dışına taşma riskini kavrarsın.
- İşlevlere adres geçirmek ve const doğruluğu: Bir işlevin değişkeni değiştirmesini adres geçirerek sağlar, const ile istenmeyen değişikliği engellersin.
- İşaretçiye işaretçi ve argv
- void işaretçiler ve genel amaçlı işlevler
- İşlev işaretçileri ve geri çağırma: Bir işlevi başka işleve parametre olarak verir, qsort gibi kütüphane çağrılarında kullanırsın.
- Kısa görev: işlev işaretçisiyle sıralanabilen tablo
Dinamik bellek
- malloc ve free: belleği istemek ve geri vermek: Çalışma sırasında bellek ayırır, dönüş değerini denetler ve işin bitince free ile iade edersin.
- calloc ve realloc ile büyüyen veri: Sıfırlanmış bellek ayırır, diziyi büyütür ve realloc başarısız olduğunda veri kaybını önlersin.
- Sahiplik kuralları ve bellek sızıntıları: Her ayrılan belleğin tek bir sahibi olması ilkesiyle sızıntıları önlersin.
- Sarkan işaretçi ve çift free: nedenleri ve korunma: Serbest bırakılmış belleğe erişimin neden tehlikeli olduğunu anlar, free sonrası işaretçiyi NULL yapma alışkanlığı edinirsin.
- Bağlı liste: işaretçilerle veri yapısı: Düğümleri dinamik bellekte zincirleyen bir liste yazar, ekler, siler ve tümünü temizlersin.
- Kısa görev: sızıntısız büyüyen satır tamponu
Güvenli C ve araçlar
- Tampon sınırları: strcpy yerine snprintf ve strncpy tuzakları: Sınırsız kopyalama işlevlerinin neden taşmaya yol açtığını anlar, sınır bilen işlevleri doğru kullanırsın.
- Güvenli girdi okuma: fgets ve uzunluk denetimi: Kullanıcı girdisini sabit boyutlu tampona fgets ile okur, satır sonunu ve fazla veriyi ele alırsın.
- Tamsayı taşması ve işaret hataları: Boyut hesaplarında taşmanın nasıl yanlış bellek ayırmaya yol açtığını görür, hesaptan önce denetim eklersin.
- Biçim dizgisi güvenliği: printf’e kullanıcı verisi vermemek: printf ailesinin biçim dizgisini sabit tutmanın nedenini anlar ve güvenli çağrı biçimini kullanırsın.
- Bellek hatalarını bulmak: Valgrind ve AddressSanitizer: Programı Valgrind ve -fsanitize=address ile çalıştırıp sızıntı, taşma ve geçersiz erişim raporlarını okursun.
- Güvenli C kodlama listesi (CERT C): Yazdığın bağlı liste ve girdi okuyucuyu CERT C önerilerine göre gözden geçirip sanitizer’la temiz çalışır hale getirirsin.
- Kısa görev: üç bellek hatasını bul ve düzelt
Bitirme
- Bitirme görevi: sızıntısız ve sınır denetimli kayıt defteri
Pratik lablar
- En küçük ve en büyüğü işaretçiyle döndürmek: Bir dizinin en küçük ve en büyük değerini çıkış işaretçileri üzerinden döndüren fonksiyonu yaz.
- API'ye const doğruluğu eklemek: Girdilerini değiştirmeyen fonksiyonlara const ekle ve bir fonksiyonun gizlice girdiyi bozduğunu derleyiciyle yakala.
- İşaretçi aritmetiğiyle tampon gezmek: İndeks yerine başlangıç ve bitiş işaretçileriyle bir bayt tamponunun sağlamasını hesapla; boş tamponda doğru çalışsın.
- argv ile seçenekleri ayrıştırmak: char **argv üzerinde gezinerek -v ve -o dosya seçeneklerini ayrıştır; eksik değerde kullanım mesajı ver.
- Karşılaştırma fonksiyonu yazmak: Çalışan kayıtlarını maaşa göre azalan sıralayan bir qsort karşılaştırma fonksiyonu yaz.
- Fonksiyon işaretçisi tablosuyla komut yönlendirmek: Uzun if-else zincirini komut adı ve fonksiyon işaretçisinden oluşan bir tabloya çevir; bilinmeyen komut hata dönsün.
- void* ile genel arama fonksiyonu: Eleman boyutu ve eşitlik geri çağrısı alan genel bir find fonksiyonu yaz; int ve struct dizileriyle test edilsin.
- Metnin kopyasını heap'te oluşturmak: Verilen metnin kopyasını malloc ile oluşturan fonksiyonu yaz; malloc başarısızlığını ve free sorumluluğunu belgele.
- realloc'u bellek kaybetmeden kullanmak: realloc sonucunu doğrudan aynı işaretçiye atayan kodu düzelt; başarısızlıkta eski blok sızmasın.
- Rapor üretecindeki sızıntıları bulmak: Valgrind çıktısını kullanarak bir rapor üretecindeki üç bellek sızıntısını bul ve hata yollarında da free çağrıldığından emin ol.
- Önbellekte çift free hatasını gidermek: Bir önbelleğin silme ve temizleme yollarında oluşan çift free'yi sahiplik kuralı koyarak düzelt; ASan temiz rapor versin.
- Sıralı bağlı listeye ekleme: Bekleme listesine yeni hastayı öncelik sırasına göre ekleyen bağlı liste fonksiyonunu yaz.
- Koşula uyan düğümleri silmek: Süresi dolmuş oturumları bağlı listeden silen fonksiyonu işaretçiye işaretçi tekniğiyle yaz; baş düğüm de silinebilsin.
- Listeyi ters çevirip sızıntısız boşaltmak: Bağlı listeyi yerinde ters çeviren ve sonra tümüyle serbest bırakan kodu yaz; Valgrind sıfır sızıntı göstersin.
- Dosya yolunu snprintf ile kurmak: strcpy ve strcat ile yol birleştiren kodu snprintf ile değiştir ve kırpılma olduğunda hata döndür.
- Uzun satırları fgets ile güvenle okumak: Kullanıcı adını fgets ile okuyan kodda satır sonunu temizle ve sınırdan uzun girdileri reddet.
- Boyut çarpımında taşmayı engellemek: count * size ile bellek ayıran fonksiyona taşma kontrolü ekle ve dev sayılarla küçük tampon ayrılmasını önle.
- Günlük fonksiyonundaki biçim dizgisi hatası: Kullanıcı mesajını printf'e biçim olarak veren günlük fonksiyonunu düzelt ve %x içeren girdilerle test et.
- İşaretli uzunluk karşılaştırmasını onarmak: Negatif uzunlukla sınır kontrolünü atlatan kopyalama fonksiyonunu size_t ve açık kontrollerle düzelt.
- void* ile genel yığın yapısı: Herhangi bir türü tutabilen, eleman boyutunu kendisi yöneten bir yığın yaz; push ve pop testleri geçsin.
- NULL ile biten dizgi dizisini saymak: char ** olarak verilen ve NULL ile biten dizgi dizisinin eleman sayısını ve en uzun elemanını döndüren fonksiyonu yaz.
Kurs hakkında
İşaretçileri ve dinamik belleği doğru kullanır, taşma ve bellek sızıntısı gibi hataları araçlarla bulup önlersin.
Ne öğreneceksin
- İşaretçiler
- Dinamik bellek
- Güvenli C ve araçlar
- Bitirme
Ön koşullar
Aynı yolun 101 düzeyindeki kurslarını bitirmiş olmak ya da o konuları biliyor olmak yeterlidir.
Lab ortamı
Dersler, tarayıcında açılan sana özel bir Kali Linux terminalinde geçer. Kurulum gerekmez; lab her derste temiz başlar.
Sık sorulan sorular
- Bu kurs benim düzeyime uygun mu?
- Kurs 201 düzeyindedir; daha düşük düzeydeki kursların konularını bildiğin varsayılır.
- Kurulum gerekir mi?
- Hayır. Her ders tarayıcında açılan sana özel bir lab ortamında geçer.
- Dersler nasıl işleniyor?
- Her ders 8 ile 10 adımdan ve bir kısa sınavdan oluşur. İlk adımlarda yazman gereken komut gösterilir, sonraki adımlarda yardım azalır; iki denemede takılırsan çözüm açılır.
- Ücretsiz deneyebilir miyim?
- Evet. Her kursun ilk üç dersi ücretsizdir.