Sarkan İşaretçiler
Serbest bırakılmış belleği kullanmanın tehlikeleri
Sarkan İşaretçiler, CoddyKit'te ücretsiz bir C Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C Academy kursu toplamda 4 dersten oluşur.
Sarkan İşaretçi Nedir
Sarkan işaretçi, daha önce serbest bırakılmış veya başka bir nedenle artık geçerli olmayan belleği gösterir.
Bunu kullanmak; çökmelere, bozulmalara veya fark edilmesi zor hatalara yol açan tanımsız davranışa neden olur.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *p = malloc(sizeof(int));
*p = 5;
printf("%d\n", *p);
free(p);
p = NULL;
return 0;
}Serbest Bıraktıktan Sonra Kullanım
En yaygın neden, free işleminden sonra bir işaretçi üzerinden okuma veya yazma yapılmasıdır.
Bu bellek bloğu başka bir amaçla yeniden kullanılmış olabilir.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *p = malloc(sizeof(int));
*p = 42;
free(p);
/* Reading *p here would be use-after-free. */
p = NULL;
printf("avoided use-after-free\n");
return 0;
}Serbest Bıraktıktan Sonra NULL Yapma
Bir işaretçiyi serbest bıraktıktan hemen sonra NULL yapmak, yanlışlıkla kullanımı açıkça görülen bir çökmeye veya zararsız bir free(NULL) çağrısına dönüştürür.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char *buf = malloc(10);
buf[0] = 'A';
free(buf);
buf = NULL;
if (buf == NULL) printf("buf is safely null\n");
return 0;
}Yerel Adres Döndürme
Yerel bir (yığın üzerindeki) değişkenin adresini döndürmek sarkan bir işaretçi oluşturur: işlev döndüğünde değişken ortadan kalkar.
Bunun yerine yığını kullanın veya bir arabellek aktarın.
#include <stdio.h>
#include <stdlib.h>
int *make_value(int v) {
int *p = malloc(sizeof(int));
*p = v;
return p;
}
int main(void) {
int *p = make_value(99);
printf("%d\n", *p);
free(p);
return 0;
}Tek Bir Bloğa Birden Çok İşaretçi
İki işaretçi aynı bloğu gösteriyorsa, biri üzerinden serbest bırakma yapmak diğerini sarkan işaretçiye dönüştürür.
Yalnızca sahibin serbest bırakma yapması için sahipliği takip edin.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *a = malloc(sizeof(int));
*a = 7;
int *b = a;
printf("%d\n", *b);
free(a);
a = NULL;
b = NULL;
printf("both nulled\n");
return 0;
}realloc Sonrasında Sarkan İşaretçi
realloc bir bloğu taşıdığında, önceki konumu gösteren eski işaretçiler sarkan işaretçiye dönüşür.
Yalnızca realloc tarafından döndürülen işaretçiyi kullanın.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *a = malloc(sizeof(int));
a[0] = 1;
int *b = realloc(a, 50 * sizeof(int));
/* a may now be dangling; use only b. */
b[0] = 2;
printf("%d\n", b[0]);
free(b);
return 0;
}Yardımcı İşlevde Serbest Bırakma
Bir yardımcı işlev bir bloğu serbest bırakırsa, çağıranın işaretçisi sarkan durumda kalır. Çağrıdan sonra işaretçiyi NULL yapın veya yardımcı işlevi işaretçiye işaretçi alacak şekilde tasarlayın.
#include <stdio.h>
#include <stdlib.h>
void destroy(int **p) {
free(*p);
*p = NULL;
}
int main(void) {
int *p = malloc(sizeof(int));
*p = 5;
destroy(&p);
printf("p is %s\n", p == NULL ? "null" : "set");
return 0;
}Neden Tehlikelidir
Serbest bıraktıktan sonra kullanım tehlikelidir; çünkü bellek artık başka veriler içeriyor olabilir. Yazma işlemleri ilgisiz durumları bozabilir ve saldırganlar bundan yararlanabilir.
Kapsama Dayalı Sarkan İşaretçiler
Blok kapsamındaki bir değişkeni gösteren işaretçi, blok sona erdiğinde geçersiz olur. İşaretçileri, gösterdikleri varlığın ömründen daha uzun süre tutmayın.
#include <stdio.h>
int main(void) {
int *p;
{
int x = 10;
p = &x;
printf("in scope: %d\n", *p);
}
/* p now dangles; do not dereference it here. */
printf("block ended\n");
return 0;
}Sarkan İşaretçileri Algılama
AddressSanitizer ve Valgrind gibi araçlar, çalışma zamanında serbest bıraktıktan sonra kullanımı yakalayarak hatanın tam satırını gösterir.
Geliştirme sırasında temizleyiciler etkinleştirilmiş şekilde derleyin.
Kodda Güvenli Yaşam Döngüsü Özeti
Ayırın, kullanın, serbest bırakın ve NULL yapın. Bunu tutarlı biçimde uygulamak, işaretçilerin sarkan duruma gelmesini önler.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *p = malloc(sizeof(int));
if (!p) return 1;
*p = 123;
printf("%d\n", *p);
free(p);
p = NULL;
return 0;
}Hızlı Kontrol
Sarkan işaretçiler hakkındaki anlayışınızı sınayın.
Özet
Sarkan işaretçiler hakkında şunları öğrendiniz:
- Serbest bırakılmış veya kapsam dışına çıkmış belleği gösterirler; bunları kullanmak tanımsız davranıştır.
- Yerel değişkenlerin adreslerini döndürmekten kaçının;
freeişleminden sonra veya realloc bir bloğu taşıdıktan sonra bir işaretçiyi asla kullanmayın. - Serbest bıraktıktan sonra işaretçileri
NULLyapın ve sahipliği takip edin. - Serbest bıraktıktan sonra kullanımı algılamak için temizleyicileri ve Valgrind'i kullanın.
Sıkça Sorulan Sorular
“Sarkan İşaretçiler” dersi ücretsiz mi?
Evet — “Sarkan İşaretçiler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C Academy kursu toplamda 4 dersten oluşur.
“Sarkan İşaretçiler” dersinde ne öğreneceğim?
Serbest bırakılmış belleği kullanmanın tehlikeleri C Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Sarkan İşaretçiler” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- malloc ve free
- calloc ve realloc
- Bellek Sızıntıları
- Sarkan İşaretçiler